2014-10-20 2 views
2

У меня есть проблема нормализации данных здесь и была бы действительно благодарна за некоторые советы и указания.SQL нормализация chalange с примером

У меня есть файл excel с очень перепутанными данными, которые я хотел бы записать в базу данных SQLite. У меня есть клетки, как это (фиктивный пример данных):

PRINTER COLORS_TO_CHANGE 
canon1  red and blue, purple, brown/green 
hp1  yellow/green, red, blue or purple 
canon2  brown or black/red, blue or green and purple 
epson1  red, green, blue 

Я нормированные данные в 3-х таблиц:

**tbl_printer** 
printer_id printer 
1    canon1 
2    hp1 
3    canon2 
4    epson1 

**tbl_colors** 
color_id  color 
1   red 
2   blue 
3   green 
4   brown 
5   purple 
6   yellow 
7   black 

**tbl_grammar** 
grammar_id  grammar 
1    and 
2    /
3    or 

То, что я хочу, чтобы в конце концов, список цветов/сочетание цветов для каждого принтер. Что-то вроде этого:

Canon1:

  • красный и синий
  • фиолетовый
  • коричневый/зеленый

Я понимаю, что я должен создавать группы (для каждой пули на список) и привязать принтеры к этим группам. А затем создавайте комбинации из цветов и грамматики. И, наконец, свяжите эти комбинации с группами. Что-то вроде этого:

tbl_printer_groups 
group_id foreign_printer_id bullet_group_id 
1   1     1 
2   1     2 
3   1     3 
4   2     1 
5   2     2 
6   2     3 
7   3     1 
8   3     2 
9   4     1 
10   4     2 
11   4     3 

И после этого я создаю комбинации, вписывающиеся в каждую группу. И это то, что меня останавливает. Если tbl_colors и tbl_grammar будет та же таблица, позволяет сказать tbl_thesame, в котором данные tbl_grammar подходит только сильфонные данные tbl_colors, я хотел бы сделать что-то вроде этого:

tbl_printergroups_to_combinations 
combination_id  foreign_group_id  foreign_thesame_id  order_in_combination 
1     1      1       1 
2     1      8       2 
3     1      2       3 
4     2      5       1 
5     3      4       1 
6     3      9       2 
7     3      3       3 
8     4      6       1 
9     4      9       2 
10     4      3       3 
11     5      1       1 
12     6      2       1 
13     6      10      2 
14     6      5       3 
15     7      4       1 
16     7      10      2 
17     7      7       3 
18     7      9       4 
19     7      1       5 
...    ...     ...      ... 

Где теряюсь как я могу это сделать из 2 разделенные таблицы. Я не могу группировать данные в одном, я не могу помещать внешние ключи и отношения в одну и ту же таблицу в разные столбцы, так как некоторые группы пулов не имеют tbl_grammar info, и было бы плохой практикой оставлять ячейки пустыми/заполнять их чем-то бессмысленным ,

Так что только выбор состоит в том, чтобы отделить данные от другого отношения родитель-потомок, но тогда я не уверен, как обязательно наводить порядок дискретных фрагментов информации при запросе данных и, наконец, распечатать строку.

Любые виды направлений/помощи будут очень признательны.

Спасибо!

+0

Имея пустые поля, это не обязательно плохо. –

+0

Нормализация не вводит новые идентификационные номера, где раньше их не было. Нет такой вещи, как нормальная форма «каждая таблица имеет номер id». Могут быть веские причины вводить номера идентификаторов, но нет причин называть нормализацию этого процесса. –

+0

@CL. Но этого следует избегать, если это возможно, не так ли? Не могли бы вы представить какой-либо пример, где предпочтительнее иметь пустые поля в таблице и хороший дизайн RDB? –

ответ

0

Добавить каждую комбинацию цветов в таблице tbl_colors, если это не сработает, то вы могли бы сделать что-то вроде этого:

PrinterId ColorId GrammarId GroupId 
1   1  1   1 
1   2  1   1 
1   6  0(add none) 2 
1   4  2   3 
1   3  2   3  

Вы можете даже вынуть grammarid колонку из вышеизложенного и добавить другую таблицу group_grammar_mapping

Group_Grammar_MappingId GrammarId GroupId 
1      1   1 

PrinterId ColorId Group_Grammar_MappingId 
1   1  1   
1   2  1   
+0

Извините, я не думаю, что это правильное решение. Например, если я правильно прочитал вашу таблицу, я бы получил для groupId 1-> «красный и зеленый». Я мог бы использовать 0 (добавить none) во вторую строку для GrammarId, но я чувствую себя некомфортно с пустыми/бессмысленными полями в столбце для внешних ключей только из-за исключений в данных. Кроме того, я хочу строго указать порядок между ColorId и GrammarId. Это было бы возможно только в том случае, если я добавлю два других столбца для каждого из * Id. Возможно, я неправильно истолковал ваш ответ? В любом случае, спасибо! –

+0

вы просто вставляете грамматику между двумя цветами. выберите colorid, printerid, groupid и grammarid в таблицу temp. Затем создайте строку с цветами и грамматикой между ними. –

1

Я не понимаю, почему вам нужно иметь tbl_grammar? Почему каждая цветовая комбинация не может быть отдельным цветом в tbl_colors? Например.

color_id  color 
1   brown or black/red 
2   brown 
3   black/red 

т.д.

+0

Насколько я понимаю, OP хочет нормализовать грамматику ... – home

+0

tbl_grammar необходим, потому что мне нужен обратный запрос (если это даже слово :)). Например, я хочу выполнить запрос, чтобы получить все недостающие цвета для выбранного принтера и в другом направлении запроса, который извлекает все принтеры с отсутствующим выбранным цветом.Например, если бы я запросил фиолетовый, я бы хотел получить canon1, hp1 и canon2. Насколько я вижу, это разделяет tbl_printergroups_to_combinations в 2 таблицах, где каждый должен содержать foreign_group_id, grammar_id и order_in_combination, а другой - foreign_group_id, color_id и order_in_combination - путь. ... to long .. –

+0

... to long ... И тогда будьте очень осторожны при вводе данных, чтобы не смешивать order_in_combination между обеими разделенными таблицами и затем объединяться с данными в самом запросе. Но это кажется громоздким, и я не уверен, что это лучшая практика, и мне интересно, не хватает ли я чего-то очевидного. –

Смежные вопросы