处理关系数据库中记录的可选字段

时间:2015-01-15 21:23:05

标签: mysql database orm relational-database database-normalization

我正在寻找一个处理可选字段的模式。具有该字段的记录将在没有该字段的记录中是唯一的。

我们以一种成分为例 成分具有名称(标题),类别名称和可选的品种名称。

+---------------+-------+----------+  
| ID_Ingredient | Title | Category |  
+---------------+-------+----------+  

一个例子是苹果。对于一些食谱,任何苹果都足够了。但是苹果有不同的品种,如“Granny Smith”和“Red Delicious”。一些苹果派食谱要求混合Granny Smith和MacIntosh品种。

为了应对这种困境,品种是可选的。

我目前的架构是有两个表:Optional_Variety和Variety:

+------------+--------------+  
| ID_Variety | Variety Name |  
+------------+--------------+  

+---------------+------------+
| ID_Ingredient | ID_Variety | // Optional_Variety table  
+---------------+------------+  

如果一种成分有多种,可以通过搜索Optional_Variety表找到其种类。

我的困境是如果一种成分有多种,那么它应该有一个独特的ID_Ingredient标识符。毕竟,格兰尼史密斯苹果不同于红美味苹果(外观和味道),所以它们应该是独特的成分。

我的另一个解决方案是在成分记录中包含品种字段:

+---------------+-------+----------+---------+  
| ID_Ingredient | Title | Category | Variety |  
+---------------+-------+----------+---------+  

我对这个模式的问题是许多成分没有多种多样,而且我会通过使用空字段来浪费数据库空间。

在我的实际实现中,有很多可选的成分字段,因此空字段浪费的数据库空间量会增加。

问题是:
使用可选字段处理记录的架构是什么,这样当字段存在时,它与不带字段的记录不同(a.k.a。具有唯一标识符)?

平台:Windows 7上的MySql,64位; MySQL Windows Vista,32位;
我正在使用带有对象关系映射的C ++ ODB来与数据库进行交互。

1 个答案:

答案 0 :(得分:1)

你会选择三张桌子:

base_ingredient (id_base_ingredient,ingredient_name,....)

多样性(id_variety,id_ingredient,variety_name)

成分(id_ingredient - PK,id_base_ingredient - FK NOT NULL,id_variety为NULL)

并且你不需要为每个品种提供不同的id_ingredient,因为你将存储成分

我只是想知道别的什么。您希望存储多少成分和变体,因为Oracle表示存储空值非常便宜(http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html

  

此外,虽然NULL本身不需要任何存储空间,但如果表定义包含任何定义为NULL的列,则最多32个NULL列,NDBCLUSTER将保留每行4个字节。 (如果定义的MySQL Cluster表有超过32个NULL列,最多64个NULL列,则每行保留8个字节。)