2009-01-07 131 views
4

在我的数据库中,我目前有两个表,除了一个字段几乎相同。我应该将两个相似的表合并为一个吗?

有关我的项目的快速说明,每年企业都会向我提供他们出售给的供应商列表,并且还会从中购买商品。由于这是每年完成的,因此我有一个名为sales的表和一个名为purchases的表。

所以在sales表,我将有领域,如:BusinessIDyearPurchaserID等,以及完全相反将在purchases表,除了会有SellerID

因此,除了PurchaserID/SellerID之外,基本上两个表都是完全相同的字段。我继承了这个系统,所以我没有这样设计数据库。我在辩论将两张桌子合并成一张名为suppliers的表格,并且只是添加一个type字段以区分它们是销售还是从中进行购买。

这听起来像个好主意吗?有没有什么我不知道为什么这不是一个好主意?

回答

2

标准化会说“是”。

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

+0

只有一个应用程序 – Joe 2009-01-07 18:27:47

+0

优秀。对单个表格的更改将如何扩展?它是用你熟悉的语言写成的吗?你可以更改应用程序吗?回归测试有多难? – duffymo 2009-01-07 18:29:18

2

绝对是一张表。我不会把它称为供应商,因为这并不反映表的含义。像busibess_partner或更好的东西可能会更合适。而不是purchase_id和seller_id,那么应该比business_partner_id更通用,是的,添加一个字段来区分。

7

做什么适合你。

教科书的答案是normalize。如果你规范化你可能会有两张桌子,其中一个与你的买家和卖家作为公司。还有一个交易表,告诉谁从谁那里买了什么。

4

如果它没有损坏,请不要修复它。让他们分开。

由于系统已经建好,所以如果你发现自己在两个表中做了很多查询,比如讨厌的UNION查询,我只会考虑这个。在一个表格中加入两个表格会让查询变得更容易,比如“向我展示在这些日期之间出售/购买的所有卖家或买家......”。

但是这听起来像这两个组的处理方式与业务规则角度截然不同,所以在这一点上它可能不值得麻烦地进行应用程序更改。 (每个查询都必须有一个“WHERE Type = 1”或类似的东西)。

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

0

您必须考虑到两个表上的记录数。如果它们的规模很大,它可能会对与客户和供应商有多个联合的查询产生巨大的冲击。

例如:谁向我们出售电脑,我们向谁出售电脑。

+0

您认为有多大“太大”? – duffymo 2009-01-07 18:31:25

2

没有一张桌子。它们是具有相似结构的不同实体。巩固它们没有什么可以获得的。 (没有任何损失,除了清晰度;但这是关键恕我直言)。

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

1

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

规范化将决定不组合两个字段,除非外键实际指向同一个表。要记住的关键规则是表格中的每一列只应该指一件事。添加第二个字段,解释第一个字段意味着什么违反了这条规则。

如果由于您总是加入两张表而导致您的查询变得混乱,您可以创建一个视图。

此外,表中的记录数几乎完全不相关。完成系统后,始终对性能进行优化。如果它将一个表中的所有记录都杀死到您的应用程序中,请在以有意义的方式对您的表进行分区的列上设置聚簇索引。

0

从完全不同的角度。我倾向于将技术视为逻辑。对我而言,决定不是数据在形状或领域上是否相似,而是它们是否合理混合。这同样可以说是否技术答案可能是正常化,我的答案是:对你来说(商业逻辑)是否合理?

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

您可能还会考虑您对表格的使用。如果他们是一种独特的逻辑类型(商业伙伴),那么您肯定会有需要访问买方和卖方的查询。否则,如果你所有的疑问都是分开的,那可能表明它们不是一样的,也不应该在一起。将它们推到一起意味着需要花费大量额外的检查和CPU时间,这与独立实体不同。

在这里可能适用的接口有一个长期使用的隐喻。除非你喜欢玩俄罗斯轮盘赌游戏,否则就是因为消防枪和照相机都在拍摄,这并不意味着它们共享一个界面。

0

从逻辑的角度来看,报告的交易似乎没有区别,只是在向谁报告这些交易方面存在差异。它应该是一个带有SellerID,BuyerID和(如果你需要的话)ReporterID(也许是附加的交易信息)的单一表格。

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

-1

由于没有一个专家报告中都愿意回答你的问题,简单的答案是:QUERY1 UNION QUERY2

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

相关问题