首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server架构设计

SQL Server架构设计
EN

Stack Overflow用户
提问于 2010-10-24 06:22:01
回答 3查看 408关注 0票数 1

我有几个在SQL SERVER中创建表格所需的Products - Plants关系。一个产品(大约8000个)在所有8个工厂生产,但很少(8000个产品中的3-4个)一个产品在一个/两个工厂生产。

我正在考虑用两种方式中的一种来实现关系。(我知道第一种方法更好,但第二种方法更容易设计和开发应用程序代码)。

1-多对多关系,基本上创建了第三个链接表ProductPlant。

2-产品表中可以为空的PlantID外键列。Products表将包含Null作为PlantId (在所有工厂制造的产品)或PlantId (如果在工厂制造)。

请提供您的专家意见。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-24 19:32:30

你正在把自己画到一个角落,选择#2。

首先,如果不在product表中只为一个产品输入两行,就不能指定在两个工厂中生产一个产品。如果你这样做,你的应用程序开发将会变得非常混乱。

其次,您不能处理一个新工厂将被添加到企业的可能性,一个最初不生产产品的工厂。这可能永远不会发生。但如果是这样,你就被卡住了。

第三,你不能添加一个新的产品,一个最初不是在任何地方生产的产品。你不能用你的#2这样的模式来这么说。

第四,你必须像这样到处写"where ProductID = CurrentProductID or ProductID is null“这样的选择标准。这对你来说可能看起来很简单,但对我来说肯定不是。我宁愿处理一个额外的连接。

好的设计原则是好的,而不是因为一些大祭司这么说。它们之所以好,是因为它们在各种各样的环境下都能工作。

如果你有一个多对多的关系,那就使用连接表。如果你不这样做,你会后悔的。

票数 2
EN

Stack Overflow用户

发布于 2010-10-24 06:26:16

创建一个名为ProductPlant的表或类似的东西。以下是各列:

  • ProductId
  • PlantId

数据在某些情况下意味着一件事,而在其他情况下意味着另一件事,这从来都不是一个好主意。这可能会导致您无法正确读取数据。

而且,这样你可以更好地规划未来,因为后来,当有人来找你说,现在一个产品是在其他工厂生产的,你已经被覆盖了。

票数 1
EN

Stack Overflow用户

发布于 2010-10-24 11:57:09

我同意其他人关于创建ProductPlant表来标识具有特定工厂的产品(如果需求发生变化,则为工厂)的观点,但我会走得更远一点,您只需要填充该表中的例外,而不是所有的8000种产品。我会添加一个位标志(或者可能是一个计算字段?)在名为IsAllPlants的产品上。对于那些未设置该标志的情况,将填充ProductPlant表。然后,按PlantID查找产品的查询将非常简单: SELECT * FROM Product WHERE IsAllPlants != 0 OR ProductID IN (SELECT ProductID FROM ProductPlant WHERE PlantID = @PlantID)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4006373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档