【问题标题】:How to decide to have a foreign key or not如何决定是否拥有外键
【发布时间】:2021-07-21 13:50:26
【问题描述】:

我有一个包含demographicsconsent 数据的父表。

父表如下所示

Person_id, Age, gender, Name,   DOB,     Consent_agreed, Agreed_share_phone_number, agreed_share_email  
   1       21     M      FM , 10/1/90       N                     N                     N
   2       23     F      MF , 11/1/92       Y                     Y                     Y

我打算像下面这样存储数据

DEMO Table

Person_id,    Age,     gender,     Name,       DOB    
     111       21       M           FM ,     10/1/90       
     222       23       F           MF ,     11/1/92  

CONSENT Table

Consent_Id    Person_id    Consent_agreed    Phone_number         email
    1             111             N              N                 N
    2             222             Y              Y                 Y

我创建了一个单独的同意表,因为一个人可能会随着时间的推移更新他的同意并且可能有多个记录。

我以这种方式对其进行标准化是否正确?

我应该如何决定是否在DEMO table 中提供consent_id

DEMO表的列是否应如下所示,consent_id表示最新的同意状态或同意状态不应包含在演示表中

Person_id,    Age,     gender,     Name,       DOB, consent_id   

【问题讨论】:

    标签: sql postgresql database-design foreign-keys database-normalization


    【解决方案1】:

    “一个人可能会随着时间的推移更新他的同意,并且可能有多个记录。”一个人的多个同意行绝对是按照您的方式拆分表格的原因。

    如果一个人的有效同意始终是consent 中的最新行(demographics 行),则没有理由将consent_id 存储在demographics 中。

    【讨论】:

    • 谢谢,点赞。所以,你的意思是说,如果我可以通过(查询)找到一个人的最新同意状态并且发现是最新的行(最后一行),这将给出他最近的同意状态,你说我们不必将它们存储在@987654325 @ 桌子。我没听错吗?
    • @TheGreat,没错。
    【解决方案2】:

    上面提供的答案是绝对正确的。但如果我是开发者,我会提出如下问题:

    1. 正如您所提到的,随着时间的推移可能会有很多同意,记录它的时间戳列在哪里?我建议您添加该列。

    2. 您是否必须始终显示最新的同意状态?如果是,那么您在个人表中获得最新同意状态的想法很好。如果没有,我建议您有一个视图,该视图同时包含个人和同意,并在需要时显示最新的同意。这样,您将节省更少的数据,这意味着同意状态不会冗余。

    希望我给了你一个正确的答案。

    问候, 柴坦尼亚

    【讨论】:

      【解决方案3】:

      我认为;

      演示表已正确设计,您不应再次编辑。但与您的使用有关的同意表的设计可能会发生变化。如果您想查看所有同意数据,所有数据都可以在一个表中。除非您想查看所有同意数据,否则您可以将最新数据保存在同意表中。并且旧的同意数据可以保存在同意历史表中。这样,您可以更快地访问最新数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-31
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 2018-06-25
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        相关资源
        最近更新 更多