我应该将两个类似的表合并成一个吗?

3
在我的数据库中,我有两个表几乎完全相同,除了一个字段。简单来说,对于我的项目,每年企业向我提交他们销售和采购的供应商清单。由于这是按年度完成的,因此我有一个名为“sales”的表和一个名为“purchases”的表。
在“sales”表中,我会有像“BusinessID”,“year”,“PurchaserID”等字段。而在“purchases”表中则完全相反,只有一个“SellerID”。
所以基本上两个表在字段方面完全相同,除了“PurchaserID”/“SellerID”。我继承了这个系统,所以我没有设计数据库。我正在考虑将这两个表合并成一个名为“suppliers”的表,并添加一个“type”字段以区分它们是销售还是采购。
这听起来是个好主意吗?是否有什么我忽略的原因导致这不是一个好主意?
10个回答

8

做适合自己的事情。

标准答案是规范化。如果您进行了规范化,您可能会有两个表,一个包含买家和卖家作为公司的信息。还有一个交易表,告诉谁从谁那里购买了什么。


5
如果没有出现问题,就不要修复它。保持它们分开。
既然系统已经建立,只有在你发现自己需要跨两个表进行大量查询时(如联合查询),才会考虑将它们合并成一个表。将两个表连接成一个表可以更轻松地查询“显示所有在这些日期之间销售或购买的卖家或买家...”等信息。
但是从业务规则的角度来看,听起来这两组人员被处理得非常不同,所以现在改变应用程序可能不值得麻烦。(每个查询都必须有"WHERE Type = 1"之类的东西)。
如果你在数据库设计阶段问这个问题,我的回答可能会不同。

3

不是一个表。它们是具有类似结构的不同实体。合并它们没有任何好处。(除了清晰度外,也没有什么损失;但在我看来这很关键)。

“规范化”不包括查找具有类似模式的表并将它们合并。


2

归一化会回答“是的”。

这个改变会影响多少应用程序?这将影响决定。


优秀。将更改扩展到单个表需要多少变化?它是用您熟悉的语言编写的吗?您能更改应用程序吗?回归测试有多难? - duffymo

2

肯定只需要一张表。而且我不会称其为"supplier",因为这并不能反映出该表的含义。类似于"busibess_partner"或者更好的名称可能更加合适。将"purchase_id"和"seller_id"改为更加通用的"business_partner_id",并且是的,添加一个字段来区分。


2

数据库总是您业务目标的有限模型。如果它对您的业务没有意义,则忽略那些说您应通过创建新的公司表(虽然您可能已经有了类似的东西)来增加数据模型复杂性的人。如果您真的想进入“完美模型”游戏,只需将一切都抽象到一个“实体”表中,很快您就会拥有一个完全无法管理的数据库。

规范化指示您不要合并两个字段,除非外键实际指向同一张表。记住的一个关键规则是,表中的每个列只应该意味着一件事。添加第二个解释第一个字段含义的字段会违反此规则。

如果您的查询变得混乱,因为您始终在连接这两个表,请创建视图。

此外,表中的记录数量几乎完全无关紧要。在系统就位后,始终针对性能进行优化。如果将所有记录放在一个表中会影响应用程序的运行,则在可意义分区的列上设置聚集索引。


0

您必须考虑两个表中的记录数量。如果它们太大,可能会对涉及客户和供应商多个连接的查询产生重大影响。

例如:谁向我们销售了计算机,我们又向谁销售了它们。


在你的观点中,“太大”是多大? - duffymo
我没有具体的数字,这取决于您的服务器速度有多快以及您可以在单个查询中连接到该表的数量。获取最复杂的查询并进行基准测试。如果它在开发者机器上运行时间在1秒以下,则应该没问题。 - Sergio
请注意至少添加现有数据的10倍,因为该表将会增长。 - Sergio

0

从完全不同的角度来看待问题。我往往会考虑逻辑胜过技术。对于我来说,决策不在于数据是否在形状或字段上相似,而是它们混合起来是否有意义。这就是说,即使技术上的答案可能是规范化,我的回答也会是:它是否对你(业务逻辑)混合在一起有意义?

另一个答案讨论了合并两者并更改命名约定。对我来说,这是一个逻辑决策:你正在表明你不与买家和卖家合作,而是与商业伙伴合作。如果这是您的情况,请这样做。

您还可以考虑表格的使用方式。如果它们属于一个唯一的逻辑类型(商业伙伴),那么您肯定会有需要访问买家和卖家的查询。否则,如果您所有的查询都是分开的,那可能表明它们并不相同,不应该放在一起。将它们合并在一起将意味着需要进行大量的额外检查,并消耗与分开实体不同的 CPU 时间。

这里有一个长期使用的关于接口的比喻,可能适用于此处。仅因为火枪和相机都可以拍摄,这并不意味着它们共享一个接口,除非你喜欢玩俄罗斯轮盘。


0

从逻辑上看,报告的交易之间似乎没有区别,只是由谁向您报告的差异。应该使用单个表格,其中包括卖方ID、买方ID和(如果需要)报告者ID(以及可能的其他交易信息)。

这就是应该的方式。现在,如何进行过渡?编写一个脚本,使用两个旧表填充一个新表应该是一个简单的练习,但是您还需要更改所有使用该信息的查询。这可能是很多工作,并且可能不值得努力。


-1

既然没有任何 专家 来回答您的问题,那么简单的答案是:query1 UNION query2

例如, SELECT * FROM table1 UNION SELECT * FROM table2 假设table1和table2具有相同的结构/标题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接