创建一个 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 个,由于设计的原因,由于引用所有内容的方式,实际上数据要少得多。

快速回答您的问题。不不不