如何以规范化的方式在关系数据库中存储单词组合?

时间:2009-11-19 11:38:31

标签: ruby-on-rails orm relational relational-database

我正在尝试找到一种很好的方法来存储以下形式的单词组合:

exhaustcleaningsystem
exhaust cleaning system
exhaustcleaning system
exhaust cleaningsystem

组合由每个案例的默认值给出。合成中的每个单词都存储为表'标签'中的唯一行。

labels
id   value
--------------------------
1    exhaustcleaningsystem
2    exhaust
3    cleaning
4    system
5    exhaustcleaning
6    cleaningsystem

我想到了一个名为'composition'的新表:

compositions
id   domain_id   range
----------------------
1    1           2,3,4
2    1           5,4
etc...

但是在列中存储多个分隔值不是规范化设计。有什么想法吗?

BTW:我正在使用MySQL和ActiveRecord / Rails。

2 个答案:

答案 0 :(得分:0)

你提出的设计甚至不是第一种正常形式,因为范围不是原子的

我在这里使用的架构是

compositions
id   domain_id
-------------
1    1
2    1

compositions-content
composition_id        rank        label_id
------------------------------------------
1                     1           2
1                     2           3
1                     3           4
2                     1           5
2                     2           4

使用composition_id引用composition.id和label_id引用label.id

排名列是可选的,当且仅当您在此处定义的范围对订单敏感时才应该在此处。

使用此设计,您在数据库级别具有一些参照完整性。

答案 1 :(得分:0)

嗯,就标准化而言,这是我能想到的:

sets
id   domain_id
--------------
1    1
2    1
etc...
compositions
id  set_id  label_id  order
---------------------------
1   1       2         1
2   1       3         2
3   1       4         3
4   2       5         1
5   2       4         2
etc...