SQL数据规范化chalange及其示例
我在这里面临数据规范化挑战,非常感谢您提供一些提示和指导 我有一个excel文件,其中包含非常混乱的数据,我想将其转录到SQLite数据库中。我有这样的单元格(虚拟示例数据): 我将数据规范化为3个表: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
**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。然后创建一个包含颜色和语法的字符串。