【发布时间】:2011-04-22 21:39:42
【问题描述】:
我需要设计一个数据库来存储用户值:对于每个用户,都有一组特定的列。
例如,Jon 想要将值存储在具有 2 列的表中:姓名、年龄。
Paul 想要将值存储在一个 3 列的表中:水果、颜色、重量。
此时,我有两个选择。
选项 1 - 将数据存储为文本值
我会有一个包含用户偏好的第一个表“个人资料”:
+----+---------+--------+-------------+
| id | user_id | label | type |
+----+---------+--------+-------------+
| 1 | 1 | name | VARCHAR(50) |
| 2 | 1 | age | INT |
| 3 | 2 | fruit | VARCHAR(50) |
| 4 | 2 | color | VARCHAR(50) |
| 5 | 2 | weight | DOUBLE |
+----+---------+--------+-------------+
然后将数据作为文本存储在另一个表中:
+----+------------+--------+
| id | id_profile | value |
+----+------------+--------+
| 1 | 1 | Aron |
| 2 | 2 | 17 |
| 3 | 1 | Vince |
| 4 | 2 | 27 |
| 5 | 1 | Elena |
| 6 | 2 | 78 |
| 7 | 3 | Banana |
| 8 | 4 | Yellow |
| 9 | 5 | 124.8 |
+----+------------+--------+
之后,我将以编程方式创建并填充一个干净的表。
选项 2 - 每种类型一列
在这个选项上,我会有一个像这样的第一个表“profiles2”:
+----+---------+--------+------+
| id | user_id | label | type |
+----+---------+--------+------+
| 1 | 1 | name | 3 |
| 2 | 1 | age | 1 |
| 3 | 2 | fruit | 3 |
| 4 | 2 | color | 3 |
| 5 | 2 | weight | 2 |
+----+---------+--------+------+
与一组类型对应的类型: 1=INT , 2=DOUBLE , 3=VARCHAR(50)
还有这样的数据表:
+----+-------------+-----------+--------------+---------------+
| id | id_profile2 | int_value | double_value | varchar_value |
+----+-------------+-----------+--------------+---------------+
| 1 | 1 | NULL | NULL | Aron |
| 2 | 2 | 17 | NULL | NULL |
| 3 | 1 | NULL | NULL | Vince |
| 4 | 2 | 27 | NULL | NULL |
| 5 | 1 | NULL | NULL | Elena |
| 6 | 2 | 78 | NULL | NULL |
| 7 | 3 | NULL | NULL | Banana |
| 8 | 4 | NULL | NULL | Yellow |
| 9 | 5 | NULL | 124.8 | NULL |
+----+-------------+-----------+--------------+---------------+
这里我有更干净的表,但仍然是一个程序化技巧来实现所有东西。
问题
有人遇到过这种情况吗?
你觉得我的两个选项怎么样?
有没有更好的解决方案,不那么棘手?
发送很多!
编辑 再次嗨,
我的模型有一个错误:无法检索“一行”信息;即“值”表中的信息不是可排序的。
在对 EAV 模型进行了一些思考之后,它显示不适合,因为它不是为存储数据而设计的,而是用于存储特定信息的。
然后我以这个模型结束: 第一表“标签”:
+----+------------+------+----------+
| id | profile_id | name | datatype |
+----+------------+------+----------+
| 1 | 1 | 1 | Nom |
| 2 | 1 | 1 | Age |
| 3 | 2 | 2 | Fruit |
| 4 | 2 | 2 | Couleur |
| 5 | 2 | 2 | Poids |
+----+------------+------+----------+
然后是一个非常简单的“节点”表,只是为了跟踪信息行:
+----+------------+
| id | profile_id |
+----+------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 2 |
+----+------------+
以及对应不同数据类型的一组表:
+----+---------+----------+--------+
| id | node_id | label_id | value |
+----+---------+----------+--------+
| 1 | 1 | 1 | John |
| 2 | 2 | 1 | Doe |
| 3 | 3 | 3 | Orange |
| 4 | 3 | 4 | Orange |
| 5 | 4 | 3 | Banane |
| 6 | 4 | 4 | Jaune |
+----+---------+----------+--------+
使用此模型,查询正常。数据输入有点棘手,但我会用干净的代码来管理。
干杯
【问题讨论】:
-
这真的是无限列的场景还是你有一个固定的数字,比如 50 以下?无限规模的不同解决方案与花时间创建 50 列的人。