我需要在我虚构的网站上销售商品,因此提出了几张表,并且想知道是否有人可以告诉我这是否合理,如果不是我可以改变的地方?
我在想;
产品表:ID,名称,成本,媒体类型(FK)
媒体:身份证,姓名(书籍,CD,DVD等)
令我困惑的是,用户可能拥有/拥有许多产品,但您如何将产品ID数组存储在一个列中?
由于
答案 0 :(得分:0)
您不会将一系列事物存储到单个列中。实际上,您通常不会将它们存储在单独的列中。
您需要稍微离开设计并去调查第三范式。这应该是您的起点,在绝大多数情况下,这是设计数据库模式的终点。
处理可变大小“数组”的正确方法是使用两个具有多对一关系的表,如:
Users
User ID (primary key)
Name
Other user info
Objects:
Object Id (primary key)
User id (foreign key, references Users(User id)
Other object info
这是最简单的形式,其中一个对象绑定到特定用户,但特定用户可能有任意数量的对象。
一个对象可以由多个用户“拥有”(我说一个对象意味着(例如)一本书“推销员的死亡”,但显然每个用户都有自己的副本对象),你使用一个连接表:
Users
User ID (primary key)
Name
Other user info
Objects:
Object Id (primary key)
User id (foreign key, references Users(User id))
Other object info
UserObjects:
User id (foreign key, references Users(User id))
Object id (foreign key, references Objects(Object id))
Count
primary key (User id, Object id)
同样,您可以通过向Users表添加对象ID来处理一个或多个。
但是,直到你弄清楚最简单的形式并理解3NF,它们通常对你不重要。
答案 1 :(得分:0)
令我困惑的是,用户可能拥有/拥有许多产品,但您如何将产品ID数组存储在一个列中?
这被称为“多对多”关系。从本质上讲,您将拥有一个用户表,一个产品表和一个用于映射它们的表:
[table] Users
- id
- name
[table] Products
- id
- name
- price
[table] Users_Products
- user_id
- product_id
然后,当您想知道用户拥有哪些产品时,您可以执行以下查询:
SELECT product_id FROM Users_Products WHERE user_id=23;
当然,出于示例的目的,用户ID 23是虚构的。生成的记录集将包含用户拥有的所有产品的ID。
答案 2 :(得分:0)
您可以在文本或varchar字段中存储JSON数组,让应用程序处理解析它。
MySQL没有本机数组类型,与PostgreSQL不同,但总的来说,我发现如果你试图存储一个数组,你可能做错了什么。当然,每条规则都有例外。
您可能需要的是用户表,然后是将产品与用户相关联的表。如果产品仅与一个用户相关,则可以在Products表中添加用户ID列。如果没有,那么你将需要另一个处理多对多关系的查找表。它看起来像这样:
------------------------
| user_id | product_id |
------------------------
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 2 |
| 3 | 1 |
| 3 | 5 |
------------------------
答案 3 :(得分:0)
我认为将一个用户拥有的所有产品存储在一列中的一种方法是将其存储为字符串,其中产品ID由逗号等分隔符分隔。虽然这不是你想要解决的方式。解决此问题的最佳方法是拥有一个单独的用户表,而不是拥有一个用户产品表,您可以将userid与产品ID相关联。您可以简单地使用简单查询来获取特定用户标识所拥有的所有产品的列表
答案 4 :(得分:0)
作为一个起点,尝试从主要部分的角度考虑系统 - 你会有一个'仓库',所以你需要一个表来列出你拥有的产品,你可能会有用户为您定期访问注册他们的详细信息 - 因此每个用户都有一个帐户。您通常会将同一个产品的所有详细信息保存在同一个表的同一行中(除非您有一个非常复杂的产品细节,但不太可能)。如果您要跟踪每个用户帐户购买的产品,则始终可以选择将订单历史记录保存为大型文本字段中的分隔列表。例如:date,id,id,id,id; date,id,id。或者您可以简单地参考订单号,并为[由任何客户]下达的订单设置单独的表格。