Php 表结构,用于替代在单个MySQL字段中存储数组

Php 表结构,用于替代在单个MySQL字段中存储数组,php,mysql,database,pdo,Php,Mysql,Database,Pdo,我目前正在使用PDO PHP和MySQL构建一个汽车预订系统,但我正在努力为用户可能添加到预订中的任何额外汽车构建我的表 目前,我有以下表格,它们使用预订表格将预订id与汽车id链接(取自各自的表格): 车表: ID | car_make | car_name 1 | Ford | Focus 2 | BMW | Z3 3 | Audi | A5 预订表: booking_ID | booking_time | total_co

我目前正在使用PDO PHP和MySQL构建一个汽车预订系统,但我正在努力为用户可能添加到预订中的任何额外汽车构建我的表

目前,我有以下表格,它们使用预订表格将预订id与汽车id链接(取自各自的表格):

车表:

ID     | car_make | car_name
1      | Ford     | Focus
2      | BMW      | Z3
3      | Audi     | A5
预订表:

booking_ID  | booking_time | total_cost | etc..
125674      | 2013-02-02   | 91.55     
887463      | 2013-01-19   | 52.00     
209930      | 2013-01-11   | 23.99     
ID     | booking_ID | car_ID | car_extras
1      | 125674     | 2      | [2,3]
2      | 887463     | 2      | [1]
3      | 209930     | 1      | [1,3]
预订表:

ID     | booking_ID | car_ID
1      | 125674     | 2
2      | 887463     | 2
3      | 209930     | 1
附加表格:

ID     | car_extra     | extra_price
1      | GPS           | 22.99
2      | Baby Seat     | 12.99
3      | Car Charger   | 15.99
ID     | booking_ID | car_extra_ID
1      | 125674     | 2
2      | 125674     | 3
3      | 887463     | 1
4      | 209930     | 1
5      | 209930     | 3
最初,我打算在预订表中添加一个额外的列,使用所选的额外车辆数组将其与预订链接,如下所示: 预订表:

booking_ID  | booking_time | total_cost | etc..
125674      | 2013-02-02   | 91.55     
887463      | 2013-01-19   | 52.00     
209930      | 2013-01-11   | 23.99     
ID     | booking_ID | car_ID | car_extras
1      | 125674     | 2      | [2,3]
2      | 887463     | 2      | [1]
3      | 209930     | 1      | [1,3]
但我已经读到这是一种不好的做法。我如何构建我的表格,以便我可以将所选的汽车额外ID(范围从用户选择的0到12)分配给特定的预订

通过创建一个新表,仅将booking_ID与extra_ID链接(这意味着相同booking ID的多行),以下操作是否有效:

所选的附加表:

ID     | car_extra     | extra_price
1      | GPS           | 22.99
2      | Baby Seat     | 12.99
3      | Car Charger   | 15.99
ID     | booking_ID | car_extra_ID
1      | 125674     | 2
2      | 125674     | 3
3      | 887463     | 1
4      | 209930     | 1
5      | 209930     | 3

您完全正确:使用每额外一行创建所选的_extras_表是最好的解决方案。当您查询该表时,您将得到您感兴趣的任何预订ID中的所有附加值的列表,并且您不需要从单个字段中解析出多个值(例如“[2,3]”)。让数据库将这些值分开。您走对了。

我建议您使用您的
选择的\u extras\u表。如果每辆车只能有一个可用的备用钥匙,您可以取消代理钥匙
ID
,并在
booking\u ID
car\u extra\u ID
上建立一个综合索引。