2010-04-05 17 views
0

我正在创建数据库结构。我必须存储ingoing和传出的消息,我想知道这是做到这一点的最佳方式。使用两个表而不是具有2个不同值的列的优点

与ENUM('in','out')列中的2个分开的表或相同的表?

有什么建议吗?

谢谢。

+0

什么样的信息?你有什么其他的细节存储在你的桌子上? – 2010-04-05 14:11:19

+0

text和user_id,很简单,是否有理由更喜欢存储在同一个表中? 性能呢? – Dario 2010-04-05 14:18:04

回答

0

由于消息是非常相同的对象,因此应包括box_id作为boxes表的参考。这将帮助您不仅在收件箱/发件箱中存储邮件,而且还可以在垃圾邮件,草稿和其他“文件夹”中存储您可能会想到的邮件。

否则,您可以有多对多的关系,并在几个框中存储相同的消息(就像gmail标签一样)。

0

如果90%的列相同,请使用一个表。

伪SQL:

TABLE messages 
    id INT 
    subject STRING 
    direction ENUM 
INDEX direction 
0

,如果他们访问/由独立的过程管理,我建议单独的表。如果同一个进程管理两种类型的消息,则使用同一个表。

0

一张桌子是最好的解决方案。

通常任何给定的数据实体都应该存储在一个表中。在这种情况下,消息是您的数据实体。

作为一个方面点我建议不要在表中使用枚举的 - 在这种情况下,消息将属于传入或传出 - 这样的消息方向应与约束被存储在一个单独的表,以确保他们是有效的。

另外方向可能是一个误人,你可能希望打电话&出文件夹或位置或框(如@Eimantas指出)。

0

如果是同一站点/应用程序的用户之间的消息的消息传递系统,则可以简单地使用1个表,其中senderIdrecipientId。收件箱是用户ID匹配recipientId的邮件,其中用户ID匹配senderId的发件箱。

请注意,这并不能很好地扩展到多个用户的消息。在这种情况下,您需要一个单独的表格,如Matt Allen所示。

1

如果您从其他用户向用户发送消息,我所做的是创建一个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)

这种方法可以很容易地“全部回复”功能,节省空间时,发送消息给多个用户。

0

我认为这取决于您是否想要一次查看所有消息。如果您的查询要返回所有传入的所有的传出,但将它们全部传回;那么你会需要两张桌子。特别是如果你最终在每个行中有很多行,那么两个表将是一个更快的解决方案。

+0

以及如果我想将它们全部归还在一起,该怎么办? – Dario 2010-04-05 15:54:47

+0

然后你加入到第二个表格。 – HLGEM 2010-04-05 20:37:35

1

决定你的结构的一件事是,传入和传出的消息是否需要存储关于它们的不同数据。如果他们这样做,你可能需要单独的表格。

另外,您通常会单独请求它们,还是始终需要这两种类型的查询。

在做出决定时,您需要坐下来决定需要存储的每种类型的数据以及如何查询数据。这将最终决定你的结构。在典型的消息处理中,您可能会有许多记录,并且考虑到该设计将有利于设计。我甚至可以用多组测试记录来测试两种方式,看看我的基本设计选择会产生什么影响。我知道人们谈论的不是过早优化,但是一旦拥有数百万条实际记录,数据库的基本结构就很难改变,现在用测试记录来设置它是值得的,并且看看哪些可能性会起作用最好用你需要做的查询类型(不要忘记用索引测试,因为它们会产生巨大的性能差异)。这不是不成熟的优化,这是在尝试糟糕的设计之前测试可能的负载,以及当用户尖叫性能时无法重构。

0

如果消息实际上是相同的实体,只有一个属性值不同,请使用单个表。如果您想在某些例程中使用子集,请创建单表视图以仅获取入站或出站消息。

如果这些消息是不同的实体,特别是如果它们针对不同的userid组进行验证,则需要两个表。

相关问题