我正在创建数据库结构。我必须存储ingoing和传出的消息,我想知道这是做到这一点的最佳方式。使用两个表而不是具有2个不同值的列的优点
与ENUM('in','out')列中的2个分开的表或相同的表?
有什么建议吗?
谢谢。
我正在创建数据库结构。我必须存储ingoing和传出的消息,我想知道这是做到这一点的最佳方式。使用两个表而不是具有2个不同值的列的优点
与ENUM('in','out')列中的2个分开的表或相同的表?
有什么建议吗?
谢谢。
由于消息是非常相同的对象,因此应包括box_id
作为boxes
表的参考。这将帮助您不仅在收件箱/发件箱中存储邮件,而且还可以在垃圾邮件,草稿和其他“文件夹”中存储您可能会想到的邮件。
否则,您可以有多对多的关系,并在几个框中存储相同的消息(就像gmail标签一样)。
如果90%的列相同,请使用一个表。
伪SQL:
TABLE messages
id INT
subject STRING
direction ENUM
INDEX direction
,如果他们访问/由独立的过程管理,我建议单独的表。如果同一个进程管理两种类型的消息,则使用同一个表。
一张桌子是最好的解决方案。
通常任何给定的数据实体都应该存储在一个表中。在这种情况下,消息是您的数据实体。
作为一个方面点我建议不要在表中使用枚举的 - 在这种情况下,消息将属于传入或传出 - 这样的消息方向应与约束被存储在一个单独的表,以确保他们是有效的。
另外方向可能是一个误人,你可能希望打电话&出文件夹或位置或框(如@Eimantas指出)。
如果是同一站点/应用程序的用户之间的消息的消息传递系统,则可以简单地使用1个表,其中senderId
和recipientId
。收件箱是用户ID匹配recipientId
的邮件,其中用户ID匹配senderId
的发件箱。
请注意,这并不能很好地扩展到多个用户的消息。在这种情况下,您需要一个单独的表格,如Matt Allen所示。
如果您从其他用户向用户发送消息,我所做的是创建一个sent_message
表和一个message_to_users
表。
可能是你不想在任何时候正确地删除一条消息,所以我只是把标志放在那里。
sent_message
------------
sent_message_id
from_id int
subject varchar(128)
body text
status char(1)
sent_datetime datetime
message_to_user
-------
message_to_user_id int
sent_message_id int
to_id int
read_datetime datetime
status char(1)
的sent_message
的地位将s(ent)
或d(eleted)
并为message_to_user
的地位将a(rrived)
,r(ead)
,或d(eleted)
这种方法可以很容易地“全部回复”功能,节省空间时,发送消息给多个用户。
决定你的结构的一件事是,传入和传出的消息是否需要存储关于它们的不同数据。如果他们这样做,你可能需要单独的表格。
另外,您通常会单独请求它们,还是始终需要这两种类型的查询。
在做出决定时,您需要坐下来决定需要存储的每种类型的数据以及如何查询数据。这将最终决定你的结构。在典型的消息处理中,您可能会有许多记录,并且考虑到该设计将有利于设计。我甚至可以用多组测试记录来测试两种方式,看看我的基本设计选择会产生什么影响。我知道人们谈论的不是过早优化,但是一旦拥有数百万条实际记录,数据库的基本结构就很难改变,现在用测试记录来设置它是值得的,并且看看哪些可能性会起作用最好用你需要做的查询类型(不要忘记用索引测试,因为它们会产生巨大的性能差异)。这不是不成熟的优化,这是在尝试糟糕的设计之前测试可能的负载,以及当用户尖叫性能时无法重构。
如果消息实际上是相同的实体,只有一个属性值不同,请使用单个表。如果您想在某些例程中使用子集,请创建单表视图以仅获取入站或出站消息。
如果这些消息是不同的实体,特别是如果它们针对不同的userid组进行验证,则需要两个表。
什么样的信息?你有什么其他的细节存储在你的桌子上? – 2010-04-05 14:11:19
text和user_id,很简单,是否有理由更喜欢存储在同一个表中? 性能呢? – Dario 2010-04-05 14:18:04