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

jq6vz3qz  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(417)

这个问题在这里已经有答案了

多对多关系示例(4个答案)
在数据库列中存储分隔列表真的那么糟糕吗(10个答案)
11个月前关门了。
我有两张table。1.产品2。联合体
产品表有类似于(product\u id,product\u name)的列。
组合表有如下列(combo\u id、combo\u name、combo\u included\u products/combo可能有产品表中的2个或更多产品/)
规则:1组合可以有很多产品。

Product Table
product_id  product_name
1           Pen
2           Pencil
3           Pen Holders
4           Sharpeners
Combo Table     
combo_id    combo_name    this_combo_includes_below_products
1           Big_combo     (1,2,3,4) => big combo includes all products
2           Small_combo   (2,4) => this combo only includes product 2,4
3           test_combo    (1,2)
4           Other_combo   (1,4)

那么,如何在组合表的第三列中插入多个产品标识呢?
我正在考虑存储像1,2,3,4和2,4这样的数据。然后问题将是编写连接查询。即
从combo上的combo join product中选择combo.combo\u id、combo.combo\u name、product.product.id。此combo\u included\u products\u id=product.product\u id<=因为将有多个产品id,所以不可能。
我也在考虑做一个脚本,首先按原样获取组合表,然后按“,”拆分第三个cloumn,然后运行iterate(select*from combo where product id=this\u combo\u included\u item\u 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";

}

但是,在设计数据库表时,我还能做些什么。谢谢。

kjthegm6

kjthegm61#

不要在一行中存储多个值。不要将数字存储为字符串。对于著名的so问题,公认的答案给出了关于这有多糟糕的深刻见解。
产品和组合之间存在多对多关系:每个产品可能出现在五月的组合中,每个组合可能包含许多产品。从规范化的Angular 来看,正确的表示方法是创建另一个表(称为桥接表)来存储关系。

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

相关问题