【问题标题】:DB Table Design - Different Statuses for Mail Type数据库表设计 - 邮件类型的不同状态
【发布时间】:2018-01-13 19:36:11
【问题描述】:

我正在为邮件创建一个数据库,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)

问题

我的问题出现在 状态 列,因为外发邮件或收件邮件的状态不同(例如,外发邮件的状态为已收到,外发邮件为已订购、已盖章、已发送等)。

我的方法

我尝试了一个 trigger 来实现这一点,但我想确保使用一些约束是否有更好的解决方案/设计?非常感谢!

【问题讨论】:

  • 问题是什么?你想check状态还是什么?
  • @juergend 谢谢!我想确保只有允许的状态适用于相应类型的邮件(传入/传出)
  • 您可以使用check 关键字来定义规则。
  • 使用单表方法并不能做太多事情。
  • 你不应该有两个表,但你应该有单独的列用于传入和传出信息。如果需要,您可以添加显示组合状态的第三个计算列。

标签: sql sql-server tsql database-design constraints


【解决方案1】:

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

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

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

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

ID
Sender 
Recipient
DispatchDate
ReceiveDate
IncomingStatus
OutgoingStatus
PostType

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

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]

等等。

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

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

【讨论】:

  • 那个!!我认为我得到了最好的设计。 +1,谢谢!!
  • @TalhaIrfan 是的,这个设计肯定更好,重复含义的属性不好。
【解决方案2】:

如果两种状态类型具有完全相同的属性,并且您可以通过添加 StatusType 属性或类似的东西来区分它们,您可以将两种状态类型存储在一个表中。

如果 OutgoingStatus 的属性与 IncomingStatus 的属性不同,那么您应该考虑创建两个单独的表。

【讨论】:

    【解决方案3】:

    一种方法是在您的 Mail 表上实施 CHECK 约束。

    你可以像这样添加一个 CHECK 约束:

    ALTER TABLE Mail
    ADD CONSTRAINT CK_MAILSTATUS 
    CHECK ((PostType = 'Outgoing' AND [Status] IN('Ordered', 'Stamped', 'Dispatched')) OR (PostType = 'Incoming' AND [Status] IN('Received')))
    

    之后,您将不能将不符合 CHECK 约束条件的记录插入到您的 Mail 表中。如果你尝试这样做,你会报错:

    INSERT 语句与 CHECK 约束“CK_MAILSTATUS”冲突。冲突发生在数据库“YourDatabase”、表“dbo.Mail”中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 2012-05-04
      • 2011-12-18
      相关资源
      最近更新 更多