Как правильно хранить композиции слов в реляционной базе данных? - PullRequest
1 голос
/ 19 ноября 2009

Я пытаюсь найти хороший способ хранить словесные композиции следующего вида:

exhaustcleaningsystem
exhaust cleaning system
exhaustcleaning system
exhaust cleaningsystem

Комбинации задаются по умолчанию для каждого случая. Каждое слово в композиции хранится в виде уникальной строки в таблице «метки».

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

Я подумал о новой таблице под названием «Композиции»:

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

Но хранение нескольких разделенных значений в столбце не является нормализованным дизайном. Есть идеи для этого?

Кстати: я использую MySQL и ActiveRecord / Rails.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2009

Ну, это насколько я могу представить с точки зрения нормализации:

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...
0 голосов
/ 19 ноября 2009

Предлагаемый вами дизайн даже не в первой нормальной форме, поскольку диапазон не атомарный

Схема, которую я бы использовал здесь, была бы

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

с составной_идентификацией, ссылающейся на составной.ид и меткой_идей, ссылающейся на метку.ид

Столбец ранга является необязательным и должен быть здесь, если и только если указанный здесь диапазон чувствителен к порядку.

С этим дизайном у вас есть некоторая ссылочная целостность на уровне БД.

...