SQL中的邮件表:要拆分还是不拆分?

时间:2012-03-05 13:04:21

标签: c# sql email

我有一个存储邮件的表Mails(谁会想到......;)。

使用tinyint MailStatus我决定是SentMail,Draft还是ReceivedMail。

现在我想知道Table-Split是否会更合适,说:

MailsSent

MailsDraft

MailsReceived

而不是MailStatus tinyint-flag。

但这也意味着当用户删除或移动邮件时,我需要移动行(在一个表中插入,在另一个表中删除),而不是仅仅切换int值。

您对此有何看法?

3 个答案:

答案 0 :(得分:2)

由于电子邮件可以归类为文件夹,我建议您创建一个存储此类文件夹/电子邮件状态的附加表MailFolders

然后在Mail表中使用外键到MailFolders。您可以将某些文件夹指定为系统文件夹,将其他文件夹指定为用户文件夹(并包含用户标识外键)。

同样,这完全取决于您的应用程序设计和要求。

答案 1 :(得分:2)

就个人而言,我会保留旗帜并将其编入索引。这样即使有一个巨大的表,你也可以足够快地从表中检索信息。如果邮件从一个文件夹移动到另一个文件夹,则只能更改标记,这样可以减轻服务器和日志文件的负担。

答案 2 :(得分:2)

从代码的角度来看,处理枚举比处理不同类型要简单得多。

从db的角度来看,在不同的表中存储这些非常相似的数据的原因是:

  • 性能问题
  • 尺寸问题(单个表格变得太大)
  • db规范化问题(SentDateTime字段的空值等)

在大多数情况下,您永远不会遇到任何尺寸/性能问题,因此问题是您需要数据的标准化程度。如果你真的不关心它,那就不要让它变得更复杂:将它留在一个表中并使用表中的枚举(int)来区分状态。