基于约束建模数据库表

时间:2018-02-04 07:37:41

标签: mysql database-design database-schema

我有这个表模型,我如何规范化它以便满足给定的约束。

VendorID ProductID Fields       Type       Value

123      P1        Expiry       Date       2018-01-01
123      P1        Quantity     Number     45
123      P1        Origin       Text       ALASKA
123      P2        Owner        Text       JEFF
123      P2        Origin       Text       OHIO
145      P1        Quantity     Number     32

约束类型列只能来自给定的一组类型。

我希望任何字段都可以添加,但它应该只来自某些定义的类型,如(text,number,date,..)。我该如何建模这个表/表?

我试图给每个字段类型一个ID

fieldtype  ID

Text       123
Date       345
Number     678

并使用相关字段引用它。

Field       FieldID

Quantity      678
Location      123

但我感到困惑,因为我如何存储相关的字段值,以便约束始终有效(约束是字段只能来自定义的字段类型)。

要存储字段值并强制执行约束我想到设计一个字段类型为列的表,但它会给我很多空值,如下所示:

Text         Number         Date         Field      VendorID
Melbourne     NULL          NULL         LOCATION     V1

NULL          36            NULL         QUANTITY     V1

NULL          NULL          2017-01-01   EXPIRY       V1

我不需要命令,只需要能够帮助我更好地理解这种情况的基本模式。

其他信息:这些字段还与供应商相关联,供应商可以为其拥有的任何产品定义字段。所以简而言之,可能没有供应商和任何他可以定义字段的产品

1 个答案:

答案 0 :(得分:0)

您可以使用ENUM,例如:

  CREATE TABLE your_table (
      VendorID int,
      type ENUM('Date', 'Number', 'Text'),
      .....
  );

并以此方式使用

  INSERT INTO your_table  (vendorId ,type, value) VALUES (123,'date','2018-01-01' );
  INSERT INTO your_table  (vendorId ,type, value) VALUES (123,'Number', 45); 

或单插入

INSERT INTO your_table  (vendorId ,type, value) 
 VALUES (123,'date','2018-01-01' ), 
        (123,'Number', 45);

并选择

  SELECT * FROM your_table WHERE type = 'Number';

请参阅此参考表单https://dev.mysql.com/doc/refman/5.7/en/enum.html

一般取决于您的应用需求.. 如果您需要在更多表中限制允许的值并且这些值是静态的,您可以将相关的枚举分配给每个表..