在“sales”表中,我会有像“BusinessID”,“year”,“PurchaserID”等字段。而在“purchases”表中则完全相反,只有一个“SellerID”。
所以基本上两个表在字段方面完全相同,除了“PurchaserID”/“SellerID”。我继承了这个系统,所以我没有设计数据库。我正在考虑将这两个表合并成一个名为“suppliers”的表,并添加一个“type”字段以区分它们是销售还是采购。
这听起来是个好主意吗?是否有什么我忽略的原因导致这不是一个好主意?
不是一个表。它们是具有类似结构的不同实体。合并它们没有任何好处。(除了清晰度外,也没有什么损失;但在我看来这很关键)。
“规范化”不包括查找具有类似模式的表并将它们合并。
归一化会回答“是的”。
这个改变会影响多少应用程序?这将影响决定。
肯定只需要一张表。而且我不会称其为"supplier",因为这并不能反映出该表的含义。类似于"busibess_partner"或者更好的名称可能更加合适。将"purchase_id"和"seller_id"改为更加通用的"business_partner_id",并且是的,添加一个字段来区分。
数据库总是您业务目标的有限模型。如果它对您的业务没有意义,则忽略那些说您应通过创建新的公司表(虽然您可能已经有了类似的东西)来增加数据模型复杂性的人。如果您真的想进入“完美模型”游戏,只需将一切都抽象到一个“实体”表中,很快您就会拥有一个完全无法管理的数据库。
规范化指示您不要合并两个字段,除非外键实际指向同一张表。记住的一个关键规则是,表中的每个列只应该意味着一件事。添加第二个解释第一个字段含义的字段会违反此规则。
如果您的查询变得混乱,因为您始终在连接这两个表,请创建视图。
此外,表中的记录数量几乎完全无关紧要。在系统就位后,始终针对性能进行优化。如果将所有记录放在一个表中会影响应用程序的运行,则在可意义分区的列上设置聚集索引。
您必须考虑两个表中的记录数量。如果它们太大,可能会对涉及客户和供应商多个连接的查询产生重大影响。
例如:谁向我们销售了计算机,我们又向谁销售了它们。
从完全不同的角度来看待问题。我往往会考虑逻辑胜过技术。对于我来说,决策不在于数据是否在形状或字段上相似,而是它们混合起来是否有意义。这就是说,即使技术上的答案可能是规范化,我的回答也会是:它是否对你(业务逻辑)混合在一起有意义?
另一个答案讨论了合并两者并更改命名约定。对我来说,这是一个逻辑决策:你正在表明你不与买家和卖家合作,而是与商业伙伴合作。如果这是您的情况,请这样做。
您还可以考虑表格的使用方式。如果它们属于一个唯一的逻辑类型(商业伙伴),那么您肯定会有需要访问买家和卖家的查询。否则,如果您所有的查询都是分开的,那可能表明它们并不相同,不应该放在一起。将它们合并在一起将意味着需要进行大量的额外检查,并消耗与分开实体不同的 CPU 时间。
这里有一个长期使用的关于接口的比喻,可能适用于此处。仅因为火枪和相机都可以拍摄,这并不意味着它们共享一个接口,除非你喜欢玩俄罗斯轮盘。
从逻辑上看,报告的交易之间似乎没有区别,只是由谁向您报告的差异。应该使用单个表格,其中包括卖方ID、买方ID和(如果需要)报告者ID(以及可能的其他交易信息)。
这就是应该的方式。现在,如何进行过渡?编写一个脚本,使用两个旧表填充一个新表应该是一个简单的练习,但是您还需要更改所有使用该信息的查询。这可能是很多工作,并且可能不值得努力。
既然没有任何 专家 来回答您的问题,那么简单的答案是:query1 UNION query2
例如, SELECT * FROM table1 UNION SELECT * FROM table2 假设table1和table2具有相同的结构/标题