SQL数据规范化chalange及其示例

SQL数据规范化chalange及其示例,sql,database,sqlite,android-sqlite,normalization,Sql,Database,Sqlite,Android Sqlite,Normalization,我在这里面临数据规范化挑战,非常感谢您提供一些提示和指导 我有一个excel文件,其中包含非常混乱的数据,我想将其转录到SQLite数据库中。我有这样的单元格(虚拟示例数据): 我将数据规范化为3个表: **tbl_printer** printer_id printer 1 canon1 2 hp1 3 canon2 4 epson1 **tbl_colors** color_id

我在这里面临数据规范化挑战,非常感谢您提供一些提示和指导

我有一个excel文件,其中包含非常混乱的数据,我想将其转录到SQLite数据库中。我有这样的单元格(虚拟示例数据):

我将数据规范化为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
我希望在最后列出每台打印机的颜色/颜色组合。大概是这样的:

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
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       
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
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       
然后我创建适合每个组的组合。这就是我的人生终点。如果tbl_颜色和tbl_语法是同一个表,让我们假设tbl_语法中的数据与tbl_颜色中的数据一致,我会这样做:

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
...                ...                    ...                       ...
我迷路的地方是如何在两张分开的桌子上做这件事。我不能将数据分组在一个表中,我不能将外键和关系放在同一个表中的不同列中,因为一些项目符号组没有tbl_语法信息,将单元格留空/填充一些无意义的内容是不好的做法

所以,唯一的选择是在另一个父子关系中分离数据,但我不确定在查询数据并最终打印字符串时,如何确保对离散的信息片段施加顺序

任何形式的指导/帮助都将不胜感激


谢谢大家!

我不明白你为什么需要tbl_语法? 为什么在tbl_颜色中,每个颜色组合实际上不能是单独的颜色?例如

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

等等。

将每个颜色组合添加到tbl_颜色表中,如果不起作用,则可以执行以下操作:

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
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       
您甚至可以从上面取出grammand列并添加另一个group\u grammar\u映射表

Group_Grammar_MappingId GrammarId GroupId
1                       1         1   

PrinterId ColorId Group_Grammar_MappingId
1         1       1         
1         2       1         

如果字段为空,则不一定是坏事。规范化不会在以前没有的地方引入新的id号。没有“每个表都有一个id号”这样的标准形式。引入id号可能有很好的理由,但没有理由称之为过程规范化。@CL。但如果可能的话,应该避免这样做,对吗?能否请您提供一些例子,说明表中有空字段更可取,并且RDB设计良好?@MikeSherrill'CatRecall',感谢您的澄清。以上过程的正确术语是什么?我应该只使用“关于RDB设计的问题”或类似的东西吗?关于打印机“canon1”,像这样的数据,
红色和蓝色,紫色,棕色/绿色
,和像这样的数据,
红色,蓝色,紫色,棕色,绿色
,在含义上有什么区别?tbl_语法是必需的,因为我需要向后查询(如果这是一个单词:))。例如,我希望执行查询以检索所选打印机的所有缺少的颜色,并在其他方向执行查询以检索缺少所选颜色的所有打印机。例如,如果我想查询紫色,我想得到canon1、hp1和canon2。就我所见,将tbl\u打印组与组合分为两个表,其中一个表包含外来组、语法组和顺序组,另一个表包含外来组、颜色组和顺序组。。。长…长。。。然后在数据输入时要非常小心,不要在两个分离的表之间的组合中混合顺序,然后在查询本身中连接数据。但这感觉很麻烦,我不确定这是否是最佳实践,我想知道我是否遗漏了一些明显的东西。对不起,我认为这不是正确的解决方案。例如,如果我读对了您的表,我会得到groupId 1->“红色和绿色以及”。我可以在第二行中使用0(addnone)来表示grammand,但我对列中外键的空/无意义字段感到不舒服,因为数据中存在异常。另外,我希望严格指定ColorId和grammand之间的顺序。这只有在我为每个*Id-own引入另外两列时才可能实现。我可能误解了你的答案吗?无论如何谢谢你!只需在两种颜色之间插入语法即可。在临时表中选择colorid、printerid、groupid和grammard。然后创建一个包含颜色和语法的字符串。