为 table 设计数据库,它可以有多个可选列和依赖项

Designing database for table which can has multiple optional column and dependencies

SO 中的每个人都有美好的一天。

我在为我的项目(孔眼工厂生产模块)设计数据库时遇到问题。作为记录,我在我的项目中使用 MySQL、C# .NET Framework 和 NHibernate。

背景故事

对于我的项目,会有 Item table。项目定义了孔眼生产中包含的所有项目。它可以是原始 Material(卷材、油漆、板材等)、中间产品(目前为冲压产品)和最终产品(组装产品、抛光产品、彩色产品等),可以出售。

所有商品都有 名称库存, 阈值列,但是SOME项可以有例如,外径颜色 列,有些项目没有。 可选列 取决于项目类型(例如线圈只有外径、内径和高度。而油漆只有颜色,而最终产品有所有这些)。 Item 也有多个 Unit (Kg, Pcs, Pack, etc) 可以转换成其他单位。同样,某些项目可能仅关联 Kg 单位,而其他项目可以关联 Kg 和 Pcs 单位(以及它们之间的转换率)。

这就是我的想法。

  1. 项目
    • ID
    • ItemType_ID[FK]
    • 姓名
    • 股票
    • 门槛
    • 时间戳(创建时间、更新时间、删除时间)
    • 已删除
  2. 维度
    • Item_ID[FK]
    • 外径
    • 内径
    • 身高
  3. 颜色
    • Item_ID[FK]
    • 颜色
  4. 物品类型
    • ID
    • 姓名
  5. 单位
    • ID
    • 姓名
  6. Item_Unit 联想table

    • Item_ID[PK]
    • Unit_ID[PK]

    ...还没写完,过来求教

我想问的是:

  1. 这是我的第二个设计,而我的第一个设计把所有可选 Item table 中的列,并在用户未输入时分配 null 该列的值。使用我的第一个设计更好吗?造成它 简化我的代码(Select 只有 1 table)。但是听说数据库里有null值不好?
  2. 在这种情况下使用继承是否更好?使用父项 table 和子项 table ( Item table 和 Coil table 作为子项) ?
  3. 对于组装物品、彩色物品、抛光物品,它们有先决条件物品,可以是中间物品或其他最终物品(一些彩色物品可以由中间物品 + 油漆制成,而其他一些彩色物品可以由组装物品+油漆,而组装物品总是由中间物品组成)。如何设计 table 以便于查找?在我的主要生产形式中,会有组合框来选择组件。
  4. 在这种情况下如何存储项目转化率?

任何建议、更正甚至整个改造都将不胜感激。非常感谢

如果每个项目都有一个 table,您将有很多空列。在 Items 变化不大的某些情况下,这不被称为糟糕的设计。

如果您的项目具有太多不同的属性而不是使用父子关系,我会建议最好的方法是使用 Entity–attribute–value model

此模型的列数较少但行数较多。检查此模型是否适用于您的问题。