【问题标题】:Mysql, storing multiple value in single column from another tableMysql,将多个值存储在另一个表的单个列中
【发布时间】:2011-01-26 13:02:08
【问题描述】:


忍受我,我真的不擅长解释事情,我什至不知道这个问题的合适标题
好的,伙计们,我有这个问题
我已经有一个表名meal

+------+--------+-----------+---------+
|  id  |  name  | serving   |  price  |
+------+--------+-----------+---------+
|  1   | soup1  |  2 person |  12.50  |
+------+--------+-----------+---------+
|  2   | soup2  |  2 person |  15.50  |
+------+--------+-----------+---------+
|  3   | soup3  |  2 person |  23.00  |
+------+--------+-----------+---------+
|  4   | drink1 |  2 person |  4.50   |
+------+--------+-----------+---------+
|  5   | drink2 |  2 person |  3.50   |
+------+--------+-----------+---------+
|  6   | drink3 |  2 person |  5.50   |
+------+--------+-----------+---------+
|  7   | frui1  |  2 person |  3.00   |
+------+--------+-----------+---------+
|  8   | fruit2 |  2 person |  3.50   |
+------+--------+-----------+---------+
|  9   | fruit3 |  2 person |  4.50   |
+------+--------+-----------+---------+

好的,现在我想允许管理员从这个 meal 表创建一个组合餐
所以这意味着,一个组合餐可以有无限数量的餐点

目前我想知道如何将组合餐存储/链接到餐点 我不想在下面存储一些东西

+------+--------------+-----------+-----------+
|  id  |  combo_name  | serving   |  meal_id  |
+------+--------------+-----------+-----------+
|  1   |   combo1     |  2 person |   1,4,7,9 |
+------+--------------+-----------+-----------+
|  2   |   combo2     |  2 person |   2,5,8   |
+------+--------------+-----------+-----------+
|  4   |   combo3     |  2 person |   3,5,6,9 |
+------+--------------+-----------+-----------+

查看meal_id 列,我认为这不是存储数据的好方法

【问题讨论】:

    标签: mysql database-design


    【解决方案1】:

    创建多对多链接表:

    combo_id    meal_id
    1           1
    1           4
    1           7
    1           9
    2           2
    2           5
    2           8
    3           3
    3           5
    3           6
    3           9
    

    要选择给定组合的所有餐点:

    SELECT  m.*
    FROM    combo_meal cm
    JOIN    meal m
    ON      m.id = cm.meal_id
    WHERE   cm.combo_id = 1
    

    【讨论】:

    • 虽然检索数据不会花费更多周期来处理,但与可以处理该字符串以获得多个值的询问者结构相比。我也对此感到困惑!
    • @AyushGoyal:准确检索哪些数据?
    • 您好,如果有全选选项包含近 300 个值,那么采用这种方法好吗?或者我应该使用一个标志来标识它是为所有人服务的。
    • @himanshu:请将其作为问题发布,并附上您的数据布局和示例查询。
    • @Quassnoi :是的,这是我的问题,请对此发表您的意见。 dba.stackexchange.com/questions/165396/…
    【解决方案2】:

    没有。这绝对不是存储数据的好方法。使用combo_header 表和combo_details 表会更好。

    combo_header 将类似于:

    +------+--------------+-----------+
    |  id  |  combo_name  | serving   |
    +------+--------------+-----------+
    |  1   |   combo1     |  2 person |
    +------+--------------+-----------+
    |  2   |   combo2     |  2 person |
    +------+--------------+-----------+
    |  4   |   combo3     |  2 person |
    +------+--------------+-----------+
    

    然后,combo_details 将类似于:

    +------+-----------+
    |  id  |  meal_id  |
    +------+-----------+
    |  1   |  1        |
    +------+-----------+
    |  1   |  4        |
    +------+-----------+
    |  1   |  7        |
    +------+-----------+
    |  1   |  9        |
    +------+-----------+
    ... / you get the idea!
    

    顺便说一句,通过在单个列中使用多个值,您违反了关系数据库的第一种正常形式。

    我提议的方式将让您回答诸如获取combo1的所有餐点的名称之类的查询非常容易解决。

    【讨论】:

      【解决方案3】:

      这被称为餐食和组合之间的多对多关系。一顿饭可以列在多个组合中,一个组合可以包含多顿饭。您将需要一个包含所有可能的餐点组合对的链接表(而不是 combo.meal_id 字段)。

      最后,您将拥有三个表:

      1. 膳食(meal_id、服务、姓名)
      2. 组合(combo_id、服务、名称)
      3. meal_combo(autoid、meal_id、combo_id)

      meal_combo.autoid 不是必需的,它只是一般性建议。

      列出包含所有餐点的组合:

      SELECT meal.id, meal.name FROM comboINNER JOIN meal_combo ON meal_combo.combo_id = combo.id INNER JOIN meal ON meal.id = meal_combo.meal_id WHERE combo.id = 132

      谷歌搜索“多对多关系”或“数据库链接表”了解详情。

      【讨论】:

      • 小时候第一次使用时,我个人就感受到了无限的力量智慧......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      相关资源
      最近更新 更多