您可以简单地拥有一个Orders
将项目(和数量)链接到用户的表。
Orders -
user_id (PK, FK -> Users Table)
item_id (PK, FK -> Items table)
quantity
time (PK)
如果你还想跟踪交易,你可以有另一个这样的表:
Transactions -
transaction_id (PK, FK -> Transaction table)
user_id (FK -> Users table)
time
Orders 表会更简单一些:
Orders -
transaction_id (PK)
item_id (PK, FK -> Items Table)
quantity
例子:
如果有 5 个用户通过相同的项目,在第一种方法中:
Orders:
user_id | item_id | quantity | time
1 | 99 | 1 | 31/10/2013 01:01:01
1 | 105 | 2 | 31/10/2013 01:01:01
2 | 99 | 1 | 31/10/2013 01:01:06
3 | 99 | 1 | 31/10/2013 01:03:00
4 | 99 | 1 | 31/10/2013 03:26:09
5 | 99 | 1 | 31/10/2013 04:11:16
如果有 5 个用户通过相同的项目,在第二种方法中:
Orders:
transaction_id | item_id | quantity
123 | 99 | 1
123 | 105 | 2
124 | 99 | 1
125 | 99 | 1
126 | 99 | 1
127 | 99 | 1
Transactions:
transaction_id | user_id | time
123 | 1 | 31/10/2013 01:01:01
124 | 2 | 31/10/2013 01:01:06
125 | 3 | 31/10/2013 01:03:00
126 | 4 | 31/10/2013 03:26:09
127 | 5 | 31/10/2013 04:11:16
最后回答你的第二个问题:
这两种桌子设计都允许多个用户毫无问题地购买相同的物品。在第一个示例中,该Orders
表有一个复合主键,PK(user_id, item_id, time_stamp)
它允许不同的用户购买相同的项目,甚至在同一时间。在第二个示例中,Orders
表具有复合主键PK(transaction_id, item_id)
,并且Transactions
表具有PK(transaction_id)
始终唯一的主键(可能从 MySQL 序列生成)。