如何将 Excel table 转换为关系数据库 Table 设计?
How can I translate an Excel table into a Relational Database Table Design?
我有一个 table 数据,我想确保我为数据库 table 设计正确格式化它。
以下Excel table/chart 显示了不同目标和尺寸组合的不同结果:
fast ave slow
small A B C
med D E F
large G H I
从 Excel 格式转换和规范化后,我最终得到以下 3 table 数据库:
Table 目标:
**goal**
id name
1 fast
2 ave
3 slow
Table 尺寸:
**size**
id name
1 small
2 med
3 large
Table 用于存储不同大小和目标组合的结果的结果:
**outcome**
id goal_id size_id name
1 1 1 A
2 2 1 B
3 3 1 C
4 1 2 D
5 2 2 E
6 3 2 F
7 1 3 G
8 2 3 H
9 3 3 I
会有如下一对多关系:
1)目标到结果
2) 结果大小
我是在正确的轨道上还是错过了一个关键概念?谢谢!
你好像有这个申请关系&table:
-- outcome of goal GOAL with size SIZE has name NAME
Outcome(goal, size, name)
goal size name
fast small A
ave small B
slow small C
fast med D
ave med E
slow med F
fast large G
ave large H
slow large I
规范化不涉及引入新的列名或值。您可能希望使用 id 而不是值(为什么?)和关系实例的 id(为什么?),但这不是规范化。规范化是关于用始终加入它的其他 table 替换 table。
我的结果的 CK 是(目标,大小)。在各种情况下都有支持和反对引入 ID 的理由。但是在这里,由于 table 的全部意义在于通过目标和大小进行查找,因此很难理解为什么需要 ID。 (不幸的是,有些 ORM 要求您有一个单列的 CK。)
您的 "relationships" 是关系数据库 FK(外键)。 FK 是从 table & 列列表到 table & 列列表。 (这样的 "relationships" 实际上是关于成对的 table 的事实。应用关系由 table 表示。)每当一个 [=25= 中的列列表的值时声明一个] table 必须作为 target/referenced table 中列列表的值出现,后面的列在后者 table 中形成 CK(候选键)。 CK 是一组列,它们在 table 中是唯一的,但不包含更小的此类集合。鉴于您的 table 和 _id
,您需要:
FOREIGN KEY outcome (goal_id) REFERENCES goal (goal_id)
FOREIGN KEY outcome (size_id) REFERENCES size (size_id)
PS 代孕与自然 PK/CK:研究这个。 (当心——那里有很多废话。)当系统用户需要一个新名称但数据库不存储任何自然 CK 时,需要代理 CK。 (有些人甚至不称此类 id 为代理。)在自然 CK 可能发生变化时调用。用于比任何多列自然 CK 更短。经常使用,因为 DBMS 不隐藏实现:例如,它们可以更快、更小地用于索引等。PS PK 的概念不是很有帮助。注意 PK 而非 CK 方面的介绍。在使设计复杂化之前总是要有理由。
我有一个 table 数据,我想确保我为数据库 table 设计正确格式化它。
以下Excel table/chart 显示了不同目标和尺寸组合的不同结果:
fast ave slow
small A B C
med D E F
large G H I
从 Excel 格式转换和规范化后,我最终得到以下 3 table 数据库:
Table 目标:
**goal**
id name
1 fast
2 ave
3 slow
Table 尺寸:
**size**
id name
1 small
2 med
3 large
Table 用于存储不同大小和目标组合的结果的结果:
**outcome**
id goal_id size_id name
1 1 1 A
2 2 1 B
3 3 1 C
4 1 2 D
5 2 2 E
6 3 2 F
7 1 3 G
8 2 3 H
9 3 3 I
会有如下一对多关系: 1)目标到结果 2) 结果大小
我是在正确的轨道上还是错过了一个关键概念?谢谢!
你好像有这个申请关系&table:
-- outcome of goal GOAL with size SIZE has name NAME
Outcome(goal, size, name)
goal size name
fast small A
ave small B
slow small C
fast med D
ave med E
slow med F
fast large G
ave large H
slow large I
规范化不涉及引入新的列名或值。您可能希望使用 id 而不是值(为什么?)和关系实例的 id(为什么?),但这不是规范化。规范化是关于用始终加入它的其他 table 替换 table。
我的结果的 CK 是(目标,大小)。在各种情况下都有支持和反对引入 ID 的理由。但是在这里,由于 table 的全部意义在于通过目标和大小进行查找,因此很难理解为什么需要 ID。 (不幸的是,有些 ORM 要求您有一个单列的 CK。)
您的 "relationships" 是关系数据库 FK(外键)。 FK 是从 table & 列列表到 table & 列列表。 (这样的 "relationships" 实际上是关于成对的 table 的事实。应用关系由 table 表示。)每当一个 [=25= 中的列列表的值时声明一个] table 必须作为 target/referenced table 中列列表的值出现,后面的列在后者 table 中形成 CK(候选键)。 CK 是一组列,它们在 table 中是唯一的,但不包含更小的此类集合。鉴于您的 table 和 _id
,您需要:
FOREIGN KEY outcome (goal_id) REFERENCES goal (goal_id)
FOREIGN KEY outcome (size_id) REFERENCES size (size_id)
PS 代孕与自然 PK/CK:研究这个。 (当心——那里有很多废话。)当系统用户需要一个新名称但数据库不存储任何自然 CK 时,需要代理 CK。 (有些人甚至不称此类 id 为代理。)在自然 CK 可能发生变化时调用。用于比任何多列自然 CK 更短。经常使用,因为 DBMS 不隐藏实现:例如,它们可以更快、更小地用于索引等。PS PK 的概念不是很有帮助。注意 PK 而非 CK 方面的介绍。在使设计复杂化之前总是要有理由。