我应该将两个相似的表组合成一个吗?

时间:2009-01-07 17:48:54

标签: mysql database database-design

在我的数据库中,我目前有两个表几乎完全相同,除了一个字段。

为了快速解释,通过我的项目,每年企业向我提交他们销售的供应商列表,并从中购买东西。由于这是每年进行的,因此我有一个名为sales的表和一个名为purchases的表。

所以在sales表格中,我会有以下字段:BusinessIDyearPurchaserID等等。完全相反的内容会出现在{{ 1}}表,除了会有purchases

因此除了SellerID / PurchaserID之外,基本上两个表都是完全相同的。我继承了这个系统,所以我没有这样设计DB。我正在讨论将这两个表组合成一个名为SellerID的表,只是添加一个suppliers字段来区分它们是出售还是购买。

这听起来像个好主意吗?对于为什么这不是一个好主意,我有什么遗漏吗?

10 个答案:

答案 0 :(得分:7)

做适合你的事。

教科书答案为normalize。如果您标准化,您可能会有2个表,一个包含您的买家和卖家作为公司。还有一个交易表,告诉谁从谁那里买了什么。

答案 1 :(得分:4)

如果没有损坏,请不要修理它。将它们分开。

由于系统已经构建,如果你发现自己在两个表中进行了大量查询,我会考虑这个,比如讨厌的UNION查询。将这两个表合二为一,可以更加轻松地查询“向我显示在这些日期之间销售/购买的所有卖家或购买者......”。

但听起来这两个群体的处理方式与业务规则的观点截然不同,因此在此时进行应用程序更改可能不值得。 (每个查询都必须有一个“WHERE Type = 1”或类似的东西)。

如果您在数据库设计阶段问过这个问题,我的回答可能会有所不同。

答案 2 :(得分:2)

标准化会说“是”。

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

答案 3 :(得分:2)

绝对是一张桌子。我不会称之为供应商,因为这并不反映表格的含义。像busibess_partner之类的东西或者更好的东西可能更合适。而不是purchase_id和seller_id,然后像business_partner_id更通用,是的,添加一个字段来区分。

答案 4 :(得分:2)

不是一张桌子。它们是具有相似结构的不同实体。巩固它们没有任何好处。 (除了清醒之外,没有任何损失;但这是至关重要的恕我直言。)

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

答案 5 :(得分:1)

数据库始终是您业务目标的有限模型。如果它对您的业务没有意义,请忽略那些说您应该通过创建新公司表来增加数据模型复杂性的人(尽管您可能已经有类似的东西)。如果你真的想进入“完美模型”游戏,只需将所有内容抽象为“实体”表格,很快就会有一个完全无法管理的数据库。

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

如果您的查询变得一团糟,因为您总是加入这两个表,那么您可以创建一个视图。

此外,表格中的记录数几乎完全无关紧要。在系统就位后,始终优化性能。如果它杀死你的应用程序以在一个表中包含所有记录,则在以有意义的方式对表进行分区的列上设置聚簇索引。

答案 6 :(得分:0)

您必须考虑两个表上的记录数。如果它们很大,那么对于有多个连接到客户和供应商的查询可能会有很大的影响。

示例:谁向我们出售计算机以及向谁销售计算机。

答案 7 :(得分:0)

从完全不同的角度来看。我倾向于考虑逻辑而不是技术。对我来说,决定的不是数据的形状或领域是否相似,而是混合它们是否合理。这也就是说,技术答案是否可以规范化,我的答案是:你(业务逻辑)将两者结合在一起是否有意义?

另一个答案是关于合并两者和更改命名约定。对我来说这是一个逻辑决定:你说你不与买家和卖家合作,而是与商业伙伴合作。如果那是你的情况,那就去做吧。

您也可以考虑使用表格的用途。如果它们属于一种独特的逻辑类型(业务伙伴),那么您肯定会有需要访问买方和卖方的查询。否则,如果您的所有查询都是分开的,那可能表明它们不相同,并且不应该保持在一起。将它们推到一起意味着需要进行大量的额外检查,并且花费的cpu时间与单独的实体不同。

关于可能适用于此的接口,有一个长期使用的比喻。仅仅因为射击枪和相机都射击,这并不意味着他们共享界面,除非你喜欢玩俄罗斯轮盘赌。

答案 8 :(得分:0)

从逻辑角度来看,报告的交易之间似乎没有区别,只有谁向您报告这些交易。它应该是一个包含SellerID,BuyerID和(如果需要)ReporterID(以及可能还有其他交易信息)的表。

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

答案 9 :(得分:-1)

由于没有专家报告的人愿意回答您的问题,简单的答案是:query1 UNION query2

EX。 SELECT * FROM table1 UNION SELECT * FROM table2假设table1和table2具有相同的结构/标题标题