【发布时间】:2012-11-19 21:27:40
【问题描述】:
我有一个数据库,我将在其中存储两个用户之间的对话。我将保存一个对话表和一个消息表。对话表将存储两个用户之间的对话,消息表将存储特定对话中的消息。两个用户之间只有一个对话,例如 MSN messenger 或 Facebook 消息,并且新消息将添加到此对话中。我有两个想法。
第一种方法:
conversations(c_id, user1, user2)
c_id 是主键 auto_incremented
messages(m_id, c_id, user_from, user_to, content)
m_id是主键auto_incremented,c_id是外键引用conversations(c_id)
在第二种方法中,
conversations(user1, user2)
(user1, user2) 是复合主键
messages(m_id, user_from, user_to, content)
m_id 是主键,(user_from, user_to) 是外键引用会话(user1, user2)
我的问题是其中哪一个更好?第一,第二还是没有?我还没有在我的任何设计中使用复合外键,老实说我不知道结果会是什么。
除了所有这些字段之外,还有读取日期、输入日期等字段。为简洁起见,我将跳过这些。
【问题讨论】:
-
我看不出
conversations表在这里给你买了什么。为什么不只是message (m_id, from_user_id, to_user_id, content)? -
实际上有两个原因,第一个我想在列表视图中显示用户的所有对话,以便他可以从该列表中选择它来查看消息。我猜,通过保留 2 个单独的表,我可以更快地做到这一点。第二个,用户将来可能会删除他们的消息,我不想丢失对话
-
要使复合键起作用,您需要为每一对进行两次对话,一个从用户 1 到用户 2,反之亦然。或者在对话中添加一个方向列,并将它们称为 user1、user2。
-
感谢方向方法,最后存储1个字节而不是2*4更有效率