【问题标题】:Inputting multiple values into a relational database field将多个值输入到关系数据库字段中
【发布时间】:2017-02-25 01:33:46
【问题描述】:

我正在为餐厅库存管理系统创建一个数据库应用程序。我目前有两个数据库表,一个用于配料表,一个用于每道菜。

Database tables and relationships

每种成分都有一个唯一的 ID,即表的 PK。 DISH 表中的“成分”字段是链接到成分 ID 的外键。每道菜显然会有很多配料,但配料也可以属于多道菜。例如,我在其他地方读到过关于创建另一个名为成分盘的表,但我不确定我是否完全理解它是如何工作的。有人可以为我指出正确的方向或尝试解释一下吗?对于上述表格,我将在此连接表中包含哪些类型的列?

非常感谢。

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    由于成分和菜肴之间存在多对多关系,您可能希望成分_菜肴成为一个交叉引用表。

    它的字段将包括成分表的外键成分_id 和菜肴表的外键dish_id。将此新表的主键设置为两个字段的组合。创建命令可能如下所示,请对其进行调整:

    CREATE TABLE Ingredient_Dish (
      ingredient_id INT    NOT NULL,
      dish_id       INT    NOT NULL,
      CONSTRAINT PK_Ingredients_by_dish PRIMARY KEY (ingredient_id, dish_id))
    ALTER TABLE Ingredient_Dish 
    ADD CONSTRAINT FK_Ingredients FOREIGN KEY (ingredient_id) REFERENCES Ingredient (ingredient_id )
    ALTER TABLE Ingredient_Dish
    ADD CONSTRAINT FK_Dishess FOREIGN KEY (dish_id) REFERENCES Dish (dish_id)
    

    【讨论】:

      【解决方案2】:

      多对多关系最好用这样一个中间(或​​“桥”)表来完成。桥接表基本上由其他表的主键组成,形成一个“更大”的外键,它允许您通过提供主键组合来实现多对多关系。

      您的用例(简化)需要这样的表格:

      dishes:
       dish_id | other_columns
      -------------------------
             1 | ...
             2 | ...
             3 | ...
      
      ingredients:
       ingredient_id | other_columns
      -------------------------------
                   1 | ...
                   2 | ...
                   3 | ...
      
      dishes_ingredients_bridge:
       dish_id | ingredient_id
      -------------------------
             1 | 1
             1 | 2
             2 | 2
             2 | 3
             3 | 3
      

      这意味着你有 3 道菜和 3 种食材,其中

      • 菜 1 由成分 1 和 2 组成
      • 菜 2 由成分 2 和 3 组成
      • 菜 3 仅由成分 3 组成
      • 成分 1 仅用于菜肴 1
      • 成分 2 用于菜肴 1 和 2
      • 成分 3 用于菜肴 2 和 3

      另外,请确保您的网桥中的组合是唯一的(创建一个多列唯一键)。忽略这一点通常不会导致大问题,但在某些边缘情况下,您的应用程序可能会以未定义或意外的方式运行。

      现在您可以像这样查询(例如)菜 1 的所有成分:

      SELECT i.*
      FROM ingredients as i
      LEFT JOIN dishes_ingredients_bridge dib
      ON dib.ingredient_id = dib.ingredient_id
      LEFT JOIN dishes as d
      ON d.dish_id = dib.dish_id
      

      将一道菜与一种食材“连接”意味着在桥上添加一行。将菜肴与配料“断开”分别意味着删除这些行。

      希望这会有所帮助。

      【讨论】:

      • 你,我的朋友,是救命稻草,这是为我的大学论文准备的,你已经把它弄得更清楚了,查询这个的语法不是我清楚的,谢谢你这么多!
      • 不客气。祝你好运! :) 我刚刚发现一个错字,我会改正的。
      【解决方案3】:

      您基本上是在描述一个桥接表。这是描述没有连接值的多对多关系的唯一方法(这是一个非常讨厌的蠕虫罐)。我建议您进一步阅读:

      http://www.kimballgroup.com/2012/02/design-tip-142-building-bridges/

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        • 2013-06-05
        • 2015-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        相关资源
        最近更新 更多