我应该将成分存储为单独的表格还是列表

时间:2017-11-20 19:16:03

标签: mysql sql

我有一个包含食谱的数据库。我可以制作两个单独的桌子;一个用于配方(标题和说明),另一个用于配料(成分,多少..等等),并参考特定配方。这样我就会有一堆指向特定食谱的成分。

  • 表格食谱

    • id = 0
    • title ='巧克力蛋糕'
    • instructions ='把它放进烤箱'
  • 餐桌配料

    • id = 0
    • ingredient ='面粉'
    • amount ='2'
    • measurement ='cups'
    • recipe_reference = 0

    • id = 1

    • ingredient ='oil'
    • amount ='3'
    • measurement ='teaspoon'
    • recipe_reference = 0

或者我可以制作1个数据库并将所有成分信息存储为字符串列表

  • 表食谱
    • title ='巧克力蛋糕'
    • instruction ='把它放进烤箱'
    • 成分='面粉|油'
    • amount ='2 | 3'
    • measurements ='cups |茶匙'

我认为第一种方式更清晰,但每种配料使用一个新表,而第二种方式每个配方使用一个表,这将使我的数据库更小更快,查询更小,我不需要做任何不必要的联接。 从长远来看,任何想法哪个方面更好?

2 个答案:

答案 0 :(得分:1)

两个更好,但我会做三个表。 recipesingredientsrecipe_ingredients。您的想法和我的想法的查询时间差异将是不明显的。 3表设置将存储更少的数据,因为您不会将“面粉”存储10,000次,而是将其存储在DB中一次,并且将在链接表中使用ID(整数)。

答案 1 :(得分:0)

通常,请避免创建在单个列中存储多个值的数据。请参阅我对Is storing a delimited list in a database column really that bad?

的回答

SQL实际上是基于您在每列中存储一个不可约值的假设。当您需要从单个列中查询子元素时,事情变得非常困难和低效。

因此,如果您始终获取完整的成分列表,然后阅读应用程序中的列表,则可以使用第二个示例中显示的竖线分隔列表。

但是,如果您计划使用SQL表达式来处理列表中的各个元素,那么请自己帮忙并将其分解为子表中的单独行。