如何决定是否有外键

ct3nt3jp  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(303)

我有一个父表,其中包含 demographics 以及 consent 数据。
父表如下所示

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

我为同意创建了一个单独的表,因为一个人可能会随着时间的推移更新他的同意,并且可能有多个记录。
我这样正常化对吗?
我该如何决定是否提供 consent_idDEMO table 不管怎样。
演示表列是否如下所示 consent_id 表示最新同意状态或同意状态不应包含在演示表中

Person_id,    Age,     gender,     Name,       DOB, consent_id
4nkexdtk

4nkexdtk1#

“一个人可能会随着时间的推移更新他的同意,并且可能有多个记录。”一个人的多个同意行无疑是按您的方式拆分表的一个原因。
如果有效同意书始终是 consent 对一个人来说( demographics 行)没有理由存储 consent_iddemographics .

af7jpaap

af7jpaap2#

我想;
演示表已正确设计,不应再次编辑。但是同意表的设计,与你的使用有关,可能会改变。如果要查看所有同意数据,则所有数据都可以位于表中。除非要查看所有同意数据,否则可以将最新数据保存在同意表中。旧的同意数据可以保存在同意历史表中。这样,您可以更快速地访问最新的数据。

omqzjyyz

omqzjyyz3#

我建议加上这个 current_consent 字段到演示表。
虽然这看起来像是一个数据和逻辑的双重应用程序(您必须确保 current_consent 指最新的同意),但它会简化你以后的生活很多。试想一下,每次检查当前许可时,您都必须编写sql查询(而且这比查看历史记录的次数要多得多)。还有性能方面的考虑。您将没有简单的联接-您必须使用join-leteral或subquery。如果你或你团队中的某个人忘记了这一点,而使用简单的连接,那么性能将受到影响。
我不是说 current_consent 会解决你所有的问题(实际上会带来更多的问题,因为这样你就可以选择如何查询你的同意书,确保最新的同意书总是最新的……),但它会使你的查询更短更快。你总是把你的问题和你没有的问题交换我猜…:)

iswrvxsc

iswrvxsc4#

上面提供的答案是绝对正确的。但如果我是开发商,我会提出如下问题:
正如您所提到的,随着时间的推移,可能会有很多同意,记录它的timestamp列在哪里?我建议你加上那一栏。
您是否必须始终显示最新的同意状态?如果是的话,您认为在person表中具有最新的同意状态是好的。如果没有,我建议你有一个观点,既人和同意,并显示最新的同意,只要需要。这样,您将保存更少的数据,这意味着同意状态没有冗余。
希望我给了你一个正确的答案。
你好,柴坦亚

相关问题