SQL中的邮件表:拆分或不拆分
本文关键字:拆分 SQL | 更新日期: 2023-09-27 18:26:59
我有一个Mails
表,它存储邮件(谁会想到…;))。
用一个微小的MailStatus
,我决定它是SentMail、Draft还是ReceivedMail。
"现在我想知道拆分餐桌是否更合适,"说道
MailsSent
MailsDraft
MailsReceived
而不是MailStatus tinyint标志。
但这也意味着,当用户删除或移动邮件时,我需要移动行(插入一个表,删除另一个表),而不仅仅是切换int值。
你对此有什么看法?
从代码的角度来看,处理枚举比处理不同类型要简单得多。
从数据库的角度来看,将这些非常相似的数据存储在不同的表中的原因是:
- 性能问题
- 大小问题(单个表过大)
- db规范化问题(SentDateTime字段的空值等)
在大多数情况下,你永远不会遇到任何大小/性能问题,所以问题是你需要如何规范化你的数据。如果你真的不在乎这一点,不要让它变得更复杂:把它放在一个表中,并在表中使用enum(int)来区分状态
由于电子邮件可以分类到文件夹中,我建议您创建一个额外的表MailFolders
来存储此类文件夹/电子邮件状态。
然后将Mail
表中的外键用于MailFolders
。您可以将其中一些文件夹指定为系统文件夹,将其他文件夹指定为用户文件夹(并包括userid外键)。
同样,这完全取决于您的应用程序设计和需求。
就我个人而言,我会保留标志并对其进行索引。这样,即使有一个巨大的表,你也可以足够快地从表中检索信息。只有当邮件从一个文件夹移动到另一个文件夹时,才能更改标志,这将减轻服务器和日志文件的压力。