2

所以我正在学习 php/mysql,我想知道如何将用户购买的商品存储在表格中。到目前为止,我创建了一个名为 X 的数据库。X 有几个表,它们是:

(a) 用户 - 这包含用户名、密码和 user_id(主键)

(b) items - 这包含 item_name、item_price 和 item_qty

现在我有一个问题。假设用户购买了 5 件商品。我将如何将其存储在数据库中?解决这个问题的方法是什么?

第二。假设 5 个用户购买了相同的商品,我如何将其存储在数据库中,以及解决这个问题的最佳方法是什么?

我对此很陌生,所以我需要帮助。

谢谢 :)

4

5 回答 5

1

您可以简单地拥有一个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 序列生成)。

于 2013-11-01T16:37:56.197 回答
0

您需要一个在这些表(用户、项目)之间建立关系的另一个表。我称它为order_tbl那家商店users_id,items_id,item_quantity,time_stamp。Time_stamp 用于时间值(您现在不需要它,但它在不久的将来会帮助您)。

于 2013-11-01T16:45:07.020 回答
0

一个连接表

可能包含以下内容:

  • 用户身份
  • product_id
  • 时间戳
  • 数量

您可能想用表上的另一个外键替换user_idand 。timestamporders

于 2013-11-01T16:36:27.737 回答
0

最好的方法是有 4 张桌子

TABLE `user` (
  `id`,
  `username`,
  `password`,
  ...
  PRIMARY KEY (`id`));

TABLE `product` (
  `id`,
  `name`,
  `price`,
  ...
  PRIMARY KEY (`id`));   

TABLE `order` (
  `id`,
  `user_id`,
  `time`,
  ...
  PRIMARY KEY (`id`),
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`));   

TABLE `order_product` (
  `order_id`,
  `product_id`,
  `quantity`,
  ...
  PRIMARY KEY (`order_id`,`product_id`),
  FOREIGN KEY (`product_id`) REFERENCES `product` (`id`),
  FOREIGN KEY (`order_id`) REFERENCES `order` (`id`));

是一个联结表,建立了和表order_product之间的多对多关系。orderproduct

而已。

于 2013-11-01T17:10:59.140 回答
0

一种方法(不添加更多表)是将外键添加到购买者的user_id的项目表中。注意,将此字段设置为索引。

以下是一些示例:
用户 101 购买项目 A,数量 1
用户 101 购买项目 B,数量 2
用户 102 购买项目 A,数量 5

项目表
item_name item_price item_qty user_id
A $1 1 101
B $2 2 101
A $1 5 102

另一个(我的偏好)是为 **purchases** 创建第三个表,并使用 **items** 表仅列出项目的唯一实例,并将主键 (**item_id**) 添加到 **项目**表。

项目
item_id(主键)
item_name

购买
purchase_id(主键)
item_id(外键)
item_qty
item_price
date_of_purchase

于 2013-11-01T16:54:35.163 回答