sql - 数据库表设计-邮件类型的不同状态

标签 sql sql-server tsql database-design constraints

我正在为 Mail 创建一个数据库,MAIL 表的设计如下:

ID (Surrogate PK)

Recipient/Sender (Coming as FK from `REGISTERED_USERS` table - Recipient if outgoing mail and Sender if incoming mail)

Dispatch/Receive Date

Status (Coming as FK)

PostType (Whether it is Sent or Received mail)

问题

我的问题出在状态列中,因为发送邮件和接收邮件的状态不同(例如,接收邮件为接收状态,已订购、已盖章、已派送等)。

我的方法

我已尝试使用触发器 来实现它,但我想确保使用某些约束是否有更好的解决方案/设计?非常感谢!

最佳答案

这可能是基于意见但是..

您不应该在同一列中存储不同的数据。您应该将所有这些传入/传出列分成两列,并只填写与不同类型邮件相关的列

在您的解决方案中,如果您在 Recipient/Sender 列中有 John,则在检查 PostType 之前您不知道 John 是收件人还是发件人 列,这不是很好的设计。每列都应该是 self 识别的。

我建议将您的设计更改为:

ID
Sender 
Recipient
DispatchDate
ReceiveDate
IncomingStatus
OutgoingStatus
PostType

如果您确实需要组合数据以在某处显示,您可以为此目的创建一个 View :

SELECT 
   CASE WHEN PostType = 1 THEN Sender ELSE Recipient END AS [Recipient/Sender] 
   CASE WHEN PostType = 1 THEN DispatchDate ELSE ReceiveDate END AS [Dispatch/Receive Date]

等..

(或将它们添加为计算列)

此外,通过分隔列,您还可以为自己腾出一个空间来存储外发邮件的收件人,例如,如果将来需要的话。

关于sql - 数据库表设计-邮件类型的不同状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45530934/

相关文章:

sql-server - 连接到 SSIS 包中的数据库时出错

mysql - #1064 - 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解使用“near”的正确语法

tsql - 将 1 到 180 分钟随机添加到 SQL Server 中的现有日期时间值

sql-server - Unicode 到非 Unicode 转换

javascript - sql插入没有错误,但表没有数据

mysql - 基于事件顺序的 SQL 查询

mysql - 如何将数据库中两个表中的连接条目显示为 HTML 表?

mysql - 将 MS-SQL Server 存储过程转换为 MySQL 查询

sql - 从字符串转换日期和/或时间时转换失败

SQL Server : How to test if a string has only digit characters