创建一个 SQL table 完全清楚某些列(某些行)将没有数据的做法是不好的做法吗?
Is it bad practice to create a SQL table knowing full well there will be no data for some columns (for certain rows)?
我试图避免使用 EAV 模型,因为我希望属性具有适当的类型。但是我想决定是应该为不同类型的产品创建多个属性 table 还是只创建一个。
所有项目都是 "products" 所以我觉得它们属于一个 table。但是,某些产品类型与其他产品类型不具有相同的属性。考虑以下因素:
Table: Product
- productID [INT]
- name [VARCHAR]
- type [FK]
Table: Product_Type
- productTypeID [INT]
- description [VARCHAR]
共有三种类型的产品:主要产品、配件产品和供应产品。不同类型的产品共享许多属性,但并非全部。所以我想知道我是否创建一个具有所有属性的属性 table 并理解 accessories/supplies 不会使用一半的列或为每种类型的产品创建单独的属性 table。
选项 #1:一个属性 Table
Table: Product_Attribute
- productID [FK]
- nameInternalCode [VARCHAR]
- nameExternalCode [VARCHAR]
- dateAnnouce [DATE]
- dateSell [DATE]
- serviceable [BIT]
- etc. etc. etc.
优点:前端逻辑 (PHP) 很简单,因为您只需要 select 一个 table 的产品属性。
缺点:虽然所有项目都是 "products",但它们并不都具有相同的属性。因此,例如配件或用品的行将包含永远不会包含数据的列。
这种做法被认为是不好的吗??要创建一个 table 充分了解某些行永远不会包含某些列的数据价值?
选项 #2:Two/Three 属性 Tables
Table: Product_Main_Attribute
- productID [FK]
- nameInternalCode [VARCHAR]
- nameExternalCode [VARCHAR]
- dateAnnouce [DATE]
- dateSell [DATE]
- serviceable [BIT]
- etc. etc. etc.
Table: Product_Accessory_Attribute
- productID [FK]
- dateAnnouce [DATE]
- dateSell [DATE]
- serviceable [BIT]
- etc. (Shorter List)
Table: Product_Supply_Attribute
- productID [FK]
- serviceable [BIT]
- etc. (Shorter List)
优点:table 更好地代表了它所负责的数据类型。不再有任何没有数据的列。
缺点:在前端创建额外的逻辑要求 (PHP)。必须首先确定它是什么类型的产品才能知道从哪个 table 读取属性。
我根据数据库的可能使用方式设计我的数据库。
阅读繁重的数据库 - 倾向于更加非规范化。
加载繁重的数据库 - 趋向于高度规范化
这是一个适合工作的工具问题。
我个人会选择第二个选项。在提出的那些中,但我会把它分解得更多。
**Products**
-ProductID
-ProductName
**Product_Main_Attribute**
-Surragate Key
- ProductUD
- nameInternalCode
- nameExternalCode
- dateAnnouce
**Product_Sale**
-Surragate Key
-ProductID
-DateSell
**Product_Service**
-Surragate Key
-ProductID
-Serviceable
这将使您可以更快地写入数据库。另一件事是,这也将有助于降低重复数据出现在数据库中的风险。
我在一个系统中工作,我们的表在类似的设计结构中有 100 个,由于设计的原因,由于引用所有内容的方式,实际上数据要少得多。
快速回答您的问题。不不不
我试图避免使用 EAV 模型,因为我希望属性具有适当的类型。但是我想决定是应该为不同类型的产品创建多个属性 table 还是只创建一个。
所有项目都是 "products" 所以我觉得它们属于一个 table。但是,某些产品类型与其他产品类型不具有相同的属性。考虑以下因素:
Table: Product
- productID [INT]
- name [VARCHAR]
- type [FK]
Table: Product_Type
- productTypeID [INT]
- description [VARCHAR]
共有三种类型的产品:主要产品、配件产品和供应产品。不同类型的产品共享许多属性,但并非全部。所以我想知道我是否创建一个具有所有属性的属性 table 并理解 accessories/supplies 不会使用一半的列或为每种类型的产品创建单独的属性 table。
选项 #1:一个属性 Table
Table: Product_Attribute
- productID [FK]
- nameInternalCode [VARCHAR]
- nameExternalCode [VARCHAR]
- dateAnnouce [DATE]
- dateSell [DATE]
- serviceable [BIT]
- etc. etc. etc.
优点:前端逻辑 (PHP) 很简单,因为您只需要 select 一个 table 的产品属性。
缺点:虽然所有项目都是 "products",但它们并不都具有相同的属性。因此,例如配件或用品的行将包含永远不会包含数据的列。
这种做法被认为是不好的吗??要创建一个 table 充分了解某些行永远不会包含某些列的数据价值?
选项 #2:Two/Three 属性 Tables
Table: Product_Main_Attribute
- productID [FK]
- nameInternalCode [VARCHAR]
- nameExternalCode [VARCHAR]
- dateAnnouce [DATE]
- dateSell [DATE]
- serviceable [BIT]
- etc. etc. etc.
Table: Product_Accessory_Attribute
- productID [FK]
- dateAnnouce [DATE]
- dateSell [DATE]
- serviceable [BIT]
- etc. (Shorter List)
Table: Product_Supply_Attribute
- productID [FK]
- serviceable [BIT]
- etc. (Shorter List)
优点:table 更好地代表了它所负责的数据类型。不再有任何没有数据的列。
缺点:在前端创建额外的逻辑要求 (PHP)。必须首先确定它是什么类型的产品才能知道从哪个 table 读取属性。
我根据数据库的可能使用方式设计我的数据库。
阅读繁重的数据库 - 倾向于更加非规范化。
加载繁重的数据库 - 趋向于高度规范化
这是一个适合工作的工具问题。
我个人会选择第二个选项。在提出的那些中,但我会把它分解得更多。
**Products**
-ProductID
-ProductName
**Product_Main_Attribute**
-Surragate Key
- ProductUD
- nameInternalCode
- nameExternalCode
- dateAnnouce
**Product_Sale**
-Surragate Key
-ProductID
-DateSell
**Product_Service**
-Surragate Key
-ProductID
-Serviceable
这将使您可以更快地写入数据库。另一件事是,这也将有助于降低重复数据出现在数据库中的风险。
我在一个系统中工作,我们的表在类似的设计结构中有 100 个,由于设计的原因,由于引用所有内容的方式,实际上数据要少得多。
快速回答您的问题。不不不