最佳数据库设计,用于保存记录

时间:2016-11-03 21:54:14

标签: sql sql-server database database-design

在我们的系统中,我们可以拥有用户可以针对产品定义的自定义属性。例如产品可以有不同的属性,如制作,型号,颜色,尺寸,电视尺寸,发布日期,性别,功率输出,制造商等

为此,我们有3个表,如下所述。

Product  
-Id  
-Name  
-Price  

Attribute  
-Id  
-Name  
-AttributeTypeId  

AttributeType  
-Id  
-Name 

作为查找表的AttributeType将只有6行来确定属性的类型[单行文本,多行文本,数字整数,数字十进制,日期,日期时间]。此表不会更改。

我是一名数据库初学者,并且正在努力决定哪些是针对产品存储属性值的最佳方式。我可以想到3种方法,但我不是100%肯定哪种方法最好。

ProductCustomAttribute  
-Id  
-ProductId  
-AttributeTypeId  
-TextValue (NVARCHAR(MAX))  
-IntegerValue  (INTEGER)  
-DecimalValue  (DECIMAL)  
-DateValue  (DATETIME)  

ProductCustomAttribute  
-Id  
-ProductId  
-AttributeTypeId  
-SingleLineValue  (NVARCHAR(MAX))  
-MultilineValue  (NVARCHAR(MAX))  
-IntegerValue  (INTEGER)  
-DecimalValue  (DECIMAL)    
-DateValue  (DATETIME)  
-DateTimeValue  (DATETIME)  

ProductCustomAttribute  
-Id  
-ProductId  
-AttributeTypeId  
-Value (NVARCHAR(MAX), will hold value for all types)

任何建议都会很棒?我认为选项1或2是最好的,但无法决定如何从这两个选项中选择。

我倾向于选项1,因为虽然选项2更具可读性,但它也意味着更多列。选项2有一列每种类型的属性,而选项1有一列用于6种属性类型的每种数据类型

1 个答案:

答案 0 :(得分:3)

  1. 如果可以将这些属性建模为核心数据表中的常规字段,请执行此操作。

  2. 如果因为这些额外字段是用户定义的,或者不能在您的核心设计中,那么这是不可能的,请尝试您的方法#2,因为:只要有可能,您需要定义数据类型,约束和规则以数据库可以强制执行它们的方式,并且应用程序不必冗余地解释和强制执行类型/约束/规则。