如何在MYSQL中存储用户购买?

时间:2013-11-01 16:34:09

标签: php mysql database database-design

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

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

(b)items - 包含item_name,item_price和item_qty

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

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

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

谢谢:)

5 个答案:

答案 0 :(得分: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 - 
  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序列)。

答案 1 :(得分:0)

A junction table

可能包含以下内容:

  • USER_ID
  • PRODUCT_ID
  • 时间戳

您可能希望将user_idtimestamp替换为orders表上的其他外键。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

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

<强>项
item_id(主键)
ITEM_NAME

<强>购买
purchase_id(主键)
item_id(外键)
item_qty
ITEM_PRICE
date_of_purchase

答案 4 :(得分: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表之间建立多对多关系。

就是这样。