为了账号安全,请及时绑定邮箱和手机立即绑定

需要设计数据库表的指导 - (混淆 1 列)

需要设计数据库表的指导 - (混淆 1 列)

PHP
函数式编程 2023-04-21 15:19:17
我有两张桌子。1.产品 2.组合产品表有像 (product_id, product_name) 这样的列。组合表有像这样的列 (combo_id, combo_name, combo_included_products /* combo 可能有来自产品表的 2 个或更多产品 */)规则:1个Combo可以有多个产品。Product Tableproduct_id  product_name1           Pen2           Pencil3           Pen Holders4           Sharpeners-Combo Table     combo_id    combo_name    this_combo_includes_below_products1           Big_combo     (1,2,3,4) => big combo includes all products2           Small_combo   (2,4) => this combo only includes product 2,43           test_combo    (1,2)4           Other_combo   (1,4)那么如何在组合表的第三列中插入多个产品 ID?我正在考虑存储 1,2,3,4 和 2,4 等数据。然后问题将是编写连接查询。IEselect combo.combo_id, combo.combo_name, product.product.id from combo join product ON combo.this_combo_included_products_id = product.product_id <= 因为会有多个产品id,这是不可能的。我也在考虑制作一个脚本,我将首先按原样获取组合表,然后我将第三个 cloumn 拆分为“,”并将运行迭代(选择 * from combo where product id=this_combo_included_item_id[i]) <=我是不确定这是个好主意,但这可能是一个替代解决方案,之后需要一些编码。(无论如何我都使用 phpmysql 来获取数据 - 所以我可以在获取后处理它。)$sql = "SELECT *  FROM combo";$result = $conn->query($sql);while($row = $result->fetch_assoc()) {  // I can run other query here  $child_query = "select combo.combo_id, combo.combo_name, product.product.id from combo join product                  ON combo.this_combo_included_products_id = product.product_id";}但是,在设计数据库表时我还能做些什么吗?谢谢。
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

不要在一行中存储多个值。不要将数字存储为字符串。

产品和组合之间存在多对多关系:每个产品可能出现在多个组合中,每个组合可能包含许多产品。从规范化的角度来看,表示它的正确方法是创建另一个表,称为桥接表,以存储关系。

create table product_combo (

    product_id int references product(product_id),

    combo_id int references combo(combo_id),

    primary key (product_id, combo_id)

);

对于您的示例数据,桥接表将包含:


product_id    combo_id

1             1

1             2

1             3

1             4

2             2

2             4

3             1

3             2

4             1

4             4

有了这个设置,假设你想选择一个给定的组合及其所有相关产品,那么你会去:


select c.*, p.*

from combos c

inner join product_combos pc on pc.combo_id = c.combo_id

inner join products p on p.product_id = pc.product_id

where c.combo_id = ?

如果您真的想要,您甚至可以为每个组合重建产品的 csv 列表:


select c.combo_id, c.combo_name, group_concat(p.product_name) product_names

from products p

inner join product_combos pc on pc.product_id = p.product_id

inner jon combos c on c.combo_id = pc.combo_id

group by c.combo_id, c.combo_name


查看完整回答
反对 回复 2023-04-21
  • 1 回答
  • 0 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信