如何在数据库中存储不同长度的列表/订单?

时间:2016-05-27 00:32:48

标签: mysql json

我一直致力于一个项目,我需要在数据库中存储订单列表(本例中为Food)。

我一直在寻找存储这些列表的最佳方法,但我找不到任何方法。

目前,我正在将数据存储在phpMyAdmin / SQL中,并将订单存储为要打印的原始HTML。它有效,但必须有一种更有效的方式来存储这些订单。

订单看起来与此相似:

  1. 汉堡餐
    • 芯片
  2. 鸡肉帕尔马
    • 柠檬水
  3. 所以,我认为最好的是制作一个单独的表来保存订单,使其结构更好一点,但我无法找到一种可行的方法来处理不同长度的订单。否则,将它存储为JSON或数组并在JS中构建它会更好吗?

    JSON示例:

    {
     "order_id": 666,
     "orders": [{
                 "item": "Burger Meal",
                 "notes": ["Chips", "Water"]
                },
                {
                 "item": "Chicken Parma",
                 "notes": ["Lemonade"] //<-- Simpler to detect number of notes?
                }]
    }
    

    TL; DR:在数据库中存储不同长度列表的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您创建一个order_items表,每个订单中的每个项目都有一行,还有一个item_notes表,每个记录都有一行。

CREATE TABLE order_items (
    item_id INT AUTO_INCREMENT NOT NULL,
    name VARCHAR(32) NOT NULL,
    order_id INT NOT NULL,
    quantity INT NOT NULL,
    PRIMARY KEY (item_id),
    UNIQUE KEY (order_id, name),
    CONSTRAINT FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
CREATE TABLE item_notes (
    note_id INT AUTO_INCREMENT NOT NULL,
    text VARCHAR(100) NOT NULL,
    item_id INT NOT NULL,
    PRIMARY KEY (note_id),
    UNIQUE KEY (item_id, text),
    CONSTRAINT FOREIGN KEY (item_id) REFERENCES order_items(item_id)
);

然后,您可以通过加入获取有关订单的所有信息:

SELECT o.*, i.*, n.*
FROM orders AS o
LEFT JOIN order_items AS i ON o.order_id = i.order_id
LEFT JOIN item_notes AS n ON i.item_id = n.item_id
WHERE o.order_id = 666