棘手的数据库设计

时间:2011-04-22 21:39:42

标签: mysql sql database

我需要设计一个数据库来存储用户值:对于每个用户,都有一组特定的列。

例如,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  |
+----+---------+----------+--------+

使用此模型,查询就可以了。数据输入有点棘手,但我会使用干净的代码进行管理。

干杯

3 个答案:

答案 0 :(得分:2)

看看EAV data models

答案 1 :(得分:2)

选项3:制作两个不同的表格。

一张桌子显然适合人们。另一个显然是为了水果。它们应该在不同的表格中。

答案 2 :(得分:0)

为什么不只有一个带有名称和ID的用户表,一个具有键值对的userValues表?约翰可以拥有关键的“水果”和价值“芒果,另一个关键”轮胎“和价值”goodyear“。鲍勃可以拥有关键的”硬币“和价值”便士“和关键”年龄“和价值”42“。任何人可以拥有他们喜欢的任何价值,并且你拥有最大的灵活性。速度不会很好,你必须将字符串转换为值,但它总是一个权衡。

干杯, 丹尼尔