我有这个表模型,我如何规范化它以便满足给定的约束。
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
我不需要命令,只需要能够帮助我更好地理解这种情况的基本模式。
其他信息:这些字段还与供应商相关联,供应商可以为其拥有的任何产品定义字段。所以简而言之,可能没有供应商和任何他可以定义字段的产品
答案 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
一般取决于您的应用需求.. 如果您需要在更多表中限制允许的值并且这些值是静态的,您可以将相关的枚举分配给每个表..