gpt4 book ai didi

sql - 我应该将此新列添加到客户表还是单独的新表?

转载 作者:IT老高 更新时间:2023-10-28 23:57:42 25 4
gpt4 key购买 nike

我有一个customers表,其中包含有关我们的客户的信息(ID,登录名,联系人信息,不同的选项,TS列等等,大约15列,大约有数百个客户)。

现在,我们需要将每日更新发送给最大的客户(不到所有客户的10%)。而且我需要存储发送给客户的最新更新的时间戳,因此下次我将仅发送新更新(我的意思是订单行中的更新TS大于存储的TS)。

如果我在客户表中添加新列“LastUpdatesSentTS”,则据我所知,它将符合规范化规则(如果不行,请提供链接以证明它将破坏规范化)。

但是,正如我还知道的那样,从物理数据库设计的角度来看,最好创建一个包含两列[CustomerID,LastUpdatesSentTS]的新表,因为只有不到10%的客户会存储该TS信息。我的意思是,如果将列添加到客户表-大多数客户在该列中将为null。另外,如果我创建一个单独的新表,也许最好从客户表中删除 bool(boolean) 列“SendUpdates”(因为通过将客户表加入新表,我将能够了解哪些客户需要发送更新)。另外,在这种情况下,恐怕几年后我将拥有一堆非常小的表,而所有这些表都可能位于客户表中(据我所知,不会破坏规范化)。

简单来说,我看到两种可能的表设计:

1)

Table customers:  
[CustomerID, Name, ..., SendUpdates, LastUpdatesSentTS]

2)
Table customers:  
[CustomerID, Name, ...]
Table customer_updates_sending:
[CustomerID, LastUpdatesSentTS]

你怎么看?

最佳答案

我建议您将其作为第二张单独的表格进行。

原因是,正如您在问题中所建议的那样,只有大约10%的客户需要这些“更新”,因此,如果您将“客户”表中的记录中的大约90%包含始终为NULL值的字段,将其作为同一客户表上的其他字段来执行。将其实现为第二张表可以避免此问题。

因为您的客户表很小,但这并不是一个大问题,但是在设计类似这样的事情时,我会考虑的更重要的问题是面向 future 。

基本上我可能会问自己:

"Would I, at any point in the future, need to know about the customer's history of updates rather than just the very last one?"



根据此应用程序的使用(听起来像是您所说的业务驱动程序),可能需要检查客户更新历史记录。思考管理信息,报告,年度摘要等)

在我写过的几乎所有业务应用程序中,为了这些确切的目的,我不得不将几乎所有内容保留至少几年(然后通常将其存档到数据仓库或单独的数据库中)。

即使您对客户的更新历史不感兴趣,我个人还是更喜欢2表方法,因为它肯定会保留历史记录,并且提供了一种更好的设计方法(因为只有customers表中的某些记录才需要记录第二个“更新”表)。就是说,但是,请参阅下面的EDIT了解更多信息。如果我知道此数据永远不需要历史记录,那么我将在现有客户表上将其实现为单个附加字段。

此外,也不必担心数据库中会包含“非常小的表”。通常,拥有它们的理由非常充分,并且是 object-relational impedance mismatch的一部分,通常可以通过应用程序代码中更具“凝聚力”的面向对象设计来克服。

编辑:

(回应对我的回答的评论)。

Aaron Bertrand的一个非常有效的观点是,如果您像这样拥有许多额外数据的实例,并且每次通过主键进行连接时都连续使用一个单独的表,那么最终将产生大量的小表保留有关一个客户的数据。在查询数据库以提取甚至一个客户的完整数据集时,这可能会变得非常繁琐,并且在许多表上的 JOINS过多且效率低下,因此负担沉重。

根据“附加”数据的性质,必须对如何实现进行务实的决定。 Aaron建议,在“LastUpdate”日期字段的情况下,在90%的客户表中包含许多 NULL并不是一件坏事,从 NULL的角度来看,我对此表示同意,这不是一件坏事。我自己提出的使用2表方法的建议并不是基于删除 NULL的愿望(尽管它确实做到了),而是确保可以保留“LastUpdate”日期的历史记录。

当然,如果完全不需要保留历史记录(请记住,明天可能不需要今天不需要),则可以在同一“客户”表上将此“LastUpdate”日期实现为附加字段。实际上,如果单个客户和单个“最后更新”日期之间仅存在直接的一对一关系,那么将其拆分为2个表将是错误的选择。在这种情况下,我将其实现为客户表的附加字段,因为它现在是该客户的标量值属性。

当然,您今天始终可以将其作为客户表上的单个字段来实现,如果成为现在保留“最新更新”日期历史记录的必要条件(比如),则可以使用 。您的数据库将其拆分为第二个表,但是请记住,您从那时开始只收集历史数据,因为您将没有上一年的上次更新日期的记录。

如果您(或将要)要求“最近更新”日期的历史记录(即客户记录和“最新更新”日期记录之间的一对多关系),则使用第二表方法,通过主键链接是唯一的选择。

关于sql - 我应该将此新列添加到客户表还是单独的新表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2253962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com