【发布时间】:2010-12-22 13:41:45
【问题描述】:
我正在研究一个食物数据库,每种食物都有一个属性列表(脂肪、能量、维生素等)
这些道具由 50 列不同的蛋白质、脂肪、碳水化合物、维生素、元素等组成。(它们很多)
未来列的数量可能会增加,但不会太多很多,极端情况下为 80
每列都需要单独引用另一个表中整个列表的一个参考书目(需要检查该值是否可靠)。
考虑 ids,应该包含一个数字、一个 NULL val 或 0 用于一个特定的异常引用(将指向另一个表)
我虽然有一些解决方案,但它们彼此非常不同,而且我是 db 的菜鸟,所以我不知道最好的解决方案。
将 value_1 视为蛋白质,将 value_2 视为碳水化合物等。
我认为最好的(我希望)2 个替代方案是:
(1) 创建一个 varchar(255?) 列,包含所有 50 个 id,如下所示:
column energy (7.00)
column carbohydrates (89.95)
column fats (63.12)
column value_bil_ids (165862,14861,816486) ## as a varchar
etc...
在这种情况下,我可以用“,”将其拆分为一个数组并检查 id,但我仍然担心编码实用性...这可能会节省太多列,但我不知道多少为了可扩展性也可能是实用的。 原则上,我认为这个选项通常用于查询优化(我希望!)
(2) 只需为每个值使用一个额外的 id 列,因此:
column energy (7.00)
column energy_bibl_id (165862)
column carbohydrates (89.95)
column carbohydrates_bibl_id (14861)
column fats (63.12)
column fats_bibl_id (816486)
etc...
这似乎是一个重要的列数,但首先要清楚,尤其是对于任何值列和他的ID的关系。
(3) 在值和参考书目后面创建一个关系表,所以
table values
energy
carbohydrates
fats
value_id --> point to table values_and_bibliographies val_bib_id
table values_and_bibliographies
val_bib_id
energy_id --> point to table bibliographies biblio_id
carbohydrates_id --> point to table bibliographies biblio_id
fats_id --> point to table bibliographies biblio_id
table bibliographies
biblio_id
biblio_name
biblio_year
我不知道这些是否是最好的解决方案,如果有人能帮助我解决这个问题,我将不胜感激!
【问题讨论】:
-
请注意,MySQL 中每个表有 4,096 列的硬限制,但可能会更少,因为它取决于列的数据类型:dev.mysql.com/doc/refman/5.0/en/column-count-limit.html
标签: php mysql scalability query-optimization