这个问题在这里已经有答案了:
多对多关系示例(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";
}
但是,在设计数据库表时,我还能做些什么。谢谢。
1条答案
按热度按时间kjthegm61#
不要在一行中存储多个值。不要将数字存储为字符串。对于著名的so问题,公认的答案给出了关于这有多糟糕的深刻见解。
产品和组合之间存在多对多关系:每个产品可能出现在五月的组合中,每个组合可能包含许多产品。从规范化的Angular 来看,正确的表示方法是创建另一个表(称为桥接表)来存储关系。
对于示例数据,桥接表将包含:
有了这个设置,假设您想选择一个给定的组合及其所有相关产品,那么您可以:
如果您真的想,甚至可以为每个组合重新生成产品的csv列表: