mySQL - 将库存表中的多个项ID添加到订单表

时间:2015-03-18 12:46:40

标签: mysql sql database

我正在研究一个学习数据库和客户端设计的项目,而且我有点陷入困境。我的订单表包括:

- order_id(int(11)) - This is the primary key and is auto incrementing.
- customer_id(int(11)) - A foreign key to the customer table 
- bike_id(int(11)) - A foreign key to the bikes table 
- equipment_id(int(11)) - A foreign key to the equipment table.
- date_from(datetime)  
- date_to(datetime) 

我想要做的是允许客户在order_id中有多个bike_id,用逗号分隔,如此#6; 6,8,10和#34; - 同样适用于equipment_ids

我怀疑它可能是bike_id的数据类型,它是一个int,除了一个整数之外它不允许任何其他内容。

我开始觉得这可能是糟糕的数据库设计,但我目前还没有看到任何其他方法。这也将是该系统的主要功能之一 - 所以我想要做对。我在阅读文档方面没有问题,所以也许有人可以给我一些关于如何解决这类问题的指示?

1 个答案:

答案 0 :(得分:2)

正如 Yngve Molnes 在评论中提到的那样,我会为你解释。

存储数据数据逗号分隔是不好的做法。你应该存储bike_id

order_id customer_id bike_id equipment_id date_from date_to
   1          1         1         1         2015      2016
   1          1         2         1         2015      2016
   1          1         3         1         2015      2016
   2          1         7         1         2014      2015
   2          1         4         1         2014      2015

您可以阅读有关数据库规范化的documentation


  

以逗号分隔的列表存在很多实际问题:

  • 无法确保每个值都是正确的数据类型:没办法 防止1,2,3,香蕉,5
  • 无法使用外键约束将值链接到查找表; 无法强制执行参照完整性。
  • 无法强制执行唯一性:无法阻止1,2,3,3,3,5
  • 如果不提取整个列表,则无法从列表中删除值。
  • 不能存储比字符串列更长的列表。
  • 很难在列表中搜索具有给定值的所有实体;您 必须使用低效的表扫描。可能不得不诉诸于常规 表达式,例如在MySQL中:idlist REGEXP' [[:<:]] 2 [[:>:]]'
  • 难以计算列表中的元素,或执行其他聚合查询。
  • 很难将值加入他们引用的查找表中。
  • 难以按排序顺序获取列表。
  • 将整数存储为字符串所需的空间大约是其两倍 存储二进制整数。更不用说逗号占用的空间了 字符。

有关Comma-Separated lists

的更多信息