每个数据库列都有一个ID,该怎么办?

vit*_*tto 2 php mysql scalability query-optimization

我在食物数据库上工作,每种食物都有一系列属性(脂肪,能量,维生素等)

这些道具由50种不同的蛋白质,脂肪,碳水化合物,维生素,元素等组成.(它们很多)
未来的柱数可能会增加,但不会太多,80表示极端情况
每列需要从另一个表中单独引用一个完整列表的一个参考书目(需要检查该值是否可靠).

考虑id,应该包含一个数字,一个NULL值,或者0表示一个特定的异常引用(将指向另一个表)

我虽然有一些解决方案,但是每个人都非常不同,而且我是db的新手,所以我不知道最好的解决方案.

将value_1视为蛋白质,将value_2视为碳水化合物等.

我认为最好的(我希望)2个替代品:

(1)创建一个包含所有50个ID的varchar(255?)列,如下所示:

column energy              (7.00)
column carbohydrates       (89.95)
column fats                (63.12)
column value_bil_ids       (165862,14861,816486) ## as a varchar
etc...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以用","将它拆分为一个数组并检查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...
Run Code Online (Sandbox Code Playgroud)

它似乎是一个重量级的列,但首先要清楚,特别是对于任何值列和他的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
Run Code Online (Sandbox Code Playgroud)

我不知道这些是否是最好的解决方案,如果有人帮我揭开它,我将不胜感激!

Byr*_*ock 5

您需要规范化该表.你正在做的是疯狂,会让你松散的头发.它们被称为关系数据库,因此您可以在不添加列的情况下执行所需操作.您想要构建它以便添加行.

请使用真实姓名,我们可以提出一个模式.

编辑好编辑.#3越来越接近理智的设计.但是你仍然不清楚参考书目在食物模式中做了什么!我想这就是你想要的.您可以将食物及其成分与参考书目联系起来.我认为参考书目就像一个食谱?

FOODS 
id name
1   broccoli
2   chicken

COMPONENTS
id name
1   carbs
2   fat
3   energy

BIBLIOGRAPHIES
id  name           year
1  chicken soup     1995


FOOD_COMPONENTS links foods to their components
id  food_id component_id bib_id  value
 1   1         1          1       25 grams
 2   1         2          1       13 onces
Run Code Online (Sandbox Code Playgroud)

因此,要获取数据,请使用连接.

SELECT * from FOOD_COMPONENTS fc
    INNER JOIN COMPONENTS c on fc.component_id = c.id
    INNER JOIN FOODS f on fc.foods_id = f.id
    INNER JOIN BIBLIOGRAPHIES b on fc.bib_id = b.id
WHERE
    b.name = 'Chicken Soup'
Run Code Online (Sandbox Code Playgroud)