我正在寻找一个处理可选字段的模式。具有该字段的记录将在没有该字段的记录中是唯一的。
我们以一种成分为例 成分具有名称(标题),类别名称和可选的品种名称。
+---------------+-------+----------+
| 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来与数据库进行交互。
答案 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个字节。)