【问题标题】:SQL Server Schema DesignSQL Server 架构设计
【发布时间】:2010-10-24 19:32:30
【问题描述】:

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

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

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

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

请提供您的专家意见。

【问题讨论】:

    标签: sql-server database-design


    【解决方案1】:

    选择 #2,您将自己逼入绝境。

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

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

    第三,您不能在产品组合中添加一种新产品,一种最初并非在任何地方生产的产品。你不能用像你的 #2 这样的模式这么说。

    第四,您必须在各处写下“其中 ProductID = CurrentProductID 或 ProductID 为空”之类的选择标准。这对你来说可能看起来很简单,但对我来说肯定不是。我宁愿处理额外的加入。

    好的设计原则是好的不是因为某些大祭司这么说。它们很好,因为它们可以在各种情况下工作。

    如果您有多对多关系,请使用联结表。不然你会后悔的。

    【讨论】:

      【解决方案2】:

      创建一个名为ProductPlant 或其他名称的表。以下是列:

      • 产品编号
      • 植物编号

      拥有在某些情况下意味着一件事而在其他情况下意味着另一件事的数据绝不是一个好主意。这会造成您错误地读取数据的可能性。

      此外,这样,您可以更好地规划未来,因为后来,当有人来找您说,现在这些其他工厂生产了一种产品时,您已经被覆盖了。

      【讨论】:

        【解决方案3】:

        我同意其他海报关于创建 ProductPlant 表以​​识别具有特定工厂(或如果要求发生变化时的工厂)的产品,但我会更进一步说您只需要填充该表例外,并非所有 8000 产品。我会在名为 IsAllPlants 的产品上添加一个位标志(或者可能是一个计算字段?)。对于未设置该标志的那些,将填充 ProductPlant 表。然后查询通过 PlantID 查找产品将非常简单: SELECT * FROM Product WHERE IsAllPlants != 0 OR ProductID IN (SELECT ProductID FROM ProductPlant WHERE PlantID = @PlantID)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-22
          • 2016-11-30
          • 2011-01-06
          • 1970-01-01
          • 2012-06-08
          • 1970-01-01
          • 2012-02-20
          • 2011-09-23
          相关资源
          最近更新 更多