Sql server sqlserver模式设计

Sql server sqlserver模式设计,sql-server,database-design,Sql Server,Database Design,我有几个需要在SQL SERVER中创建表的产品-工厂关系。8000件左右的产品在所有8家工厂生产,但8000件中很少有3-4件产品在一个或两个工厂生产 我想用两种方式中的任何一种来实现关系。我知道第一种方法更好,但第二种方法更易于设计和开发应用程序代码 1-多对多关系,基本上创建第三个链接表ProductPlant 2-Products表中可为空的PlantID外键列。Products表中的空值将作为所有工厂生产的PlantId产品,如果在工厂生产,则为PlantId 请提供您的专家意见。创建

我有几个需要在SQL SERVER中创建表的产品-工厂关系。8000件左右的产品在所有8家工厂生产,但8000件中很少有3-4件产品在一个或两个工厂生产

我想用两种方式中的任何一种来实现关系。我知道第一种方法更好,但第二种方法更易于设计和开发应用程序代码

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

2-Products表中可为空的PlantID外键列。Products表中的空值将作为所有工厂生产的PlantId产品,如果在工厂生产,则为PlantId

请提供您的专家意见。

创建一个名为ProductPlant或其他的表格。以下是专栏:

产品ID 植物 拥有在某些情况下意味着一件事,而在其他情况下意味着另一件事的数据从来都不是一个好主意。这可能会导致您错误地读取数据


同样,你也在为未来做更好的规划,这样做是因为以后,当有人来找你说,现在一个产品在这些其他工厂生产,你已经被涵盖了。

我同意其他海报中关于创建ProductPlant表,以便在需求发生变化时识别具有特定工厂的产品,但我想进一步说,您只需要为例外情况填充该表,而不是所有8000种产品。我会添加一个位标志或者一个计算字段?一种叫做IsAllPlants的产品。对于未设置该标志的设备,将填充ProductPlant表。然后,通过PlantID查询查找产品将非常简单:
从IsAllPlants所在的产品中选择*0或ProductID,从ProductPlant中选择ProductID,其中PlantID=@PlantID

您正在使用选项2将自己绘制到一个角落

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

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

第三,你不能将一个新产品添加到混合中,一个最初没有在任何地方生产的产品。对于像您的2这样的模式,您不能这么说

第四,您必须编写这样的选择标准,其中ProductID=CurrentProductID或ProductID到处都是null。这对你来说可能很简单,但对我来说肯定不是。我宁愿处理一个额外的加入

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

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