我需要设计一个数据库来存储用户值:对于每个用户,都有一组特定的列。
例如,Jon希望将值存储在包含2列的表中:name,age。
Paul希望将值存储在3列表中:水果,颜色,重量。
此时,我有2个选项。
选项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 |
+----+---------+----------+--------+
使用此模型,查询就可以了。数据输入有点棘手,但我会使用干净的代码进行管理。
干杯
答案 0 :(得分:2)
答案 1 :(得分:2)
选项3:制作两个不同的表格。
一张桌子显然适合人们。另一个显然是为了水果。它们应该在不同的表格中。
答案 2 :(得分:0)
为什么不只有一个带有名称和ID的用户表,一个具有键值对的userValues表?约翰可以拥有关键的“水果”和价值“芒果,另一个关键”轮胎“和价值”goodyear“。鲍勃可以拥有关键的”硬币“和价值”便士“和关键”年龄“和价值”42“。任何人可以拥有他们喜欢的任何价值,并且你拥有最大的灵活性。速度不会很好,你必须将字符串转换为值,但它总是一个权衡。
干杯, 丹尼尔