Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 针对记录保存自定义属性值的最佳数据库设计_Sql_Sql Server_Database_Database Design - Fatal编程技术网

Sql 针对记录保存自定义属性值的最佳数据库设计

Sql 针对记录保存自定义属性值的最佳数据库设计,sql,sql-server,database,database-design,Sql,Sql Server,Database,Database Design,在我们的系统中,我们可以拥有用户可以根据产品定义的自定义属性。e、 g.产品可以具有不同的属性,如品牌、型号、颜色、尺寸、电视尺寸、发布日期、性别、功率输出、制造商等 为此,我们有3个表,如下所述 Product -Id -Name -Price Attribute -Id -Name -AttributeTypeId AttributeType -Id -Name 用作查找表的AttributeType只有6行来确定属性的类型[单行文本、多行文本

在我们的系统中,我们可以拥有用户可以根据产品定义的自定义属性。e、 g.产品可以具有不同的属性,如品牌、型号、颜色、尺寸、电视尺寸、发布日期、性别、功率输出、制造商等

为此,我们有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种属性类型

  • 如果可以将这些属性建模为核心数据表中的普通字段,请这样做

  • 如果因为这些额外字段是用户定义的或无法在核心设计中使用而无法实现,请尝试您的方法#2因为:只要有可能,您希望以数据库可以强制执行的方式定义数据类型、约束和规则,应用程序不必冗余地解释和执行类型/约束/规则


  • 看起来您已尝试实现最大规格化。退一步,看看你的输入的性质。属性的类型会改变吗?根据你的设计,听起来会的。但如果没有,则可以删除属性类型的最后一个表。AttributeType表不会更改,它将始终有6行。我把它放进去是因为我想在我的设计中有一个描述性的值。实际上我会选择第三个选项。可能只有您的UI需要所有表。拉取数据时,选项#3将为您提供更好的性能。交叉发布:方法2是否因为字段更特定于域而优于1?因此,更容易添加属性类型特定的规则。我也倾向于这种方法,我能想到的唯一缺点是在每一行上都有两个额外的空列(尽管我对此不太在意)。如果有疑问,请更加具体。