【问题标题】:MYSQL Database Design: How to store 3 Dimensional data for every user?MYSQL 数据库设计:如何为每个用户存储 3 维数据?
【发布时间】:2015-10-17 21:59:53
【问题描述】:

为了解释我的问题,我将使用插图。假设我是店主,我有我的“商店”MYSql 数据库。然后,我为我店里的所有顾客准备了一张桌子,还有一张包含我销售的所有产品的桌子。

除了保存客户的基本详细信息(姓名、电子邮件等)外,我还希望能够保存他们创建的每个单独的购物篮。我可以自信地使用带有一维数据的 MYSql 表,例如一行代表一个用户/产品。但是,如何以有效的方式在此商店数据库中存储可变数量的购物篮,每个购物篮包含不同数量的产品 - 对于每个用户?

感谢任何建议,我对 MYSQL / 数据库设计相当陌生!

谢谢,史蒂夫。

【问题讨论】:

  • 基本数据库理论:数据库中的每一列都是另一个“维度”,基本上......如果你想要多个购物篮,那么添加一个每个用户的购物篮 ID 字段。
  • 您应该换一种方式思考:您有一个篮子表和一个列供客户参考。此引用是客户端 ID。
  • 行不代表实体。实体由值(它们的键)表示,而行与实体/值相关。 Peter Chen 的论文The Entity-Relationship Model : Toward a Unified View of Data 定义了这些概念,数据库开发人员应该阅读。

标签: mysql database database-design


【解决方案1】:

一个完全规范化的设计应该有一个篮子表,它有自己的唯一 ID 并引用客户 ID。这个购物篮表还可以包含有关购物篮的信息,例如它的创建时间、它是否被取消或用于支付等。然后,您的数据库也会有一个 basket_products 表,它引用购物篮表的唯一 ID,以及产品的id,以及该产品放入该篮子时您将拥有的任何信息。这将允许临时折扣或当时对该产品的特殊客户优惠。

BASKET
id  autonum
customer_id  references customer.id
other info about the basket

BASKET_PRODUCTS (or PRODUCTS_IN_BASKET)
basket_id  references basket.id
product_id  references product.id
other info about the products as the are put in this basket (number purchased, price per, etc)

【讨论】:

  • 所以在 BASKET_PRODUCTS 表中,如果它们在多个篮子中,您会重复项目吗?并且这是否可以合理地扩展到成千上万的用户,每个用户有多个 50 种左右的产品篮子?谢谢老哥!
  • 只要设置了正确的索引,50000 行的一位数或两位数的倍数很容易由在适度硬件上运行的 MySQL 处理。我同意这个答案。
  • Steve - 是的,数据库在处理表中的数百万条记录时没有问题。我已经处理了多达 40 亿条记录的表。最终,您将需要进行某种归档或清理过程,但无论您选择哪种布局,这都是正常的(令人讨厌的双关语)并且都是正确的。
  • Steve - 顺便说一下,既然你说你是从 DB 开始的,那么让我谈谈我的一个小烦恼。您可能已经很清楚这一点,如果是这样,请原谅我这么说...为您将如何命名表和字段选择一个好的命名标准并坚持下去。它将大大有助于使您的数据库和代码更易于维护。
猜你喜欢
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多