【问题标题】:Creating a relational database from N dimensional table从 N 维表创建关系数据库
【发布时间】:2017-02-02 12:17:44
【问题描述】:

我有一堆函数,它们有很多输入参数,但唯一输出相对较少,我正在尝试将输出制成表格,以便对照输入进行查找。通常,对于给定的函数,我将有一组 2D 表,其中包含一些确定要查看哪个表的规则。因此,例如,如果某个变量的值小于 1,我应该查看表 1,但如果变量大于或等于 1,我应该查看表 2 以确定输出(但更典型的是表使用将取决于 5 或​​ 6 个变量的值)。还有一个额外的问题 - 表 2 和表 1 不一定具有相同的行和列。

到目前为止,我的解决方案是创建包含所有表的所有信息的平面文件表(所以我最终得到了一个大而复杂的表),并且表中的值在表的末尾(在此之前的所有列中都表示输入)。因为并非所有表格都相同,这意味着我有很多零或空白(表格不适用)。该解决方案适用于我的目的,但是当我尝试将更多功能制成表格时,表格变得越来越复杂,并且有人能够轻松检查和验证表格值是相当重要的。我希望有一种使用关系数据库呈现信息的更清晰的方式,但我不确定这是否会使事情变得或多或少清晰。到目前为止,使用我排序的平面文件已经相当清楚了,但是随着表格变得越来越复杂,人类阅读变得越来越困难,并且开始出现问题。

我研究了数据库设计原则,但我发现的所有介绍性材料都使用了比我的简单得多的示例,而且我不确定如何扩展我所阅读的内容以满足我的需要。我的理解是,如果我的函数有 N 个输入,那么我需要 N+1 个表来创建关系数据库;所以我不确定这是否会使事情变得更清晰或更不清晰。我希望这是数据库专家的常见问题,希望有人能提供一些建议!

编辑:

已要求提供一个示例,因此我编写了一个与我的问题类似的示例。假设我想计算给定日期的服装价格。我有三个 2D 表格,可以为我提供这些信息:

2010 年 1 月 1 日之前:

+--------+----------+----------+----------+----------+
|        | Fabric A | Fabric B | Fabric C | Fabric D |
+--------+----------+----------+----------+----------+
| Size S |        1 |        2 |        3 |        4 |
| Size M |        5 |        6 |        7 |        8 |
| Size L |        9 |       10 |       11 |       12 |
+--------+----------+----------+----------+----------+

2010 年 1 月 1 日之后:

如果设计师是 P:

+--------+------------+------------+------------+
|        | Location X | Location Y | Location Z |
+--------+------------+------------+------------+
| Size S |          1 |          2 |          3 |
| Size M |          5 |          6 |          7 |
| Size L |          9 |         10 |         11 |
+--------+------------+------------+------------+

如果设计师是 Q:

+--------+------------+------------+------------+
|        | Location X | Location Y | Location Z |
+--------+------------+------------+------------+
| Size S |          2 |          2 |          3 |
| Size M |          4 |          5 |          5 |
| Size L |          6 |          7 |          8 |
+--------+------------+------------+------------+

这就是三张桌子。我所做的是创建了一个类似这样的表:

+------------+----------+------+--------+----------+-------+
|    Date    | Designer | Size | Fabric | Location | Price |
+------------+----------+------+--------+----------+-------+
| 01/01/2010 | P        | L    | A      | X        |     6 |
| 01/01/2010 | P        | L    | A      | Y        |     7 |
| 01/01/2010 | P        | L    | A      | Z        |     8 |
| 01/01/2010 | P        | L    | B      | X        |     6 |
| 01/01/2010 | P        | L    | B      | Y        |     7 |
| 01/01/2010 | P        | L    | B      | Z        |     8 |
| 01/01/2010 | P        | L    | C      | X        |     6 |
| 01/01/2010 | P        | L    | C      | Y        |     7 |
| 01/01/2010 | P        | L    | C      | Z        |     8 |
| 01/01/2010 | P        | L    | D      | X        |     6 |
| 01/01/2010 | P        | L    | D      | Y        |     7 |
| 01/01/2010 | P        | L    | D      | Z        |     8 |
| 01/01/2010 | P        | M    | A      | X        |     4 |
| 01/01/2010 | P        | M    | A      | Y        |     5 |
| 01/01/2010 | P        | M    | A      | Z        |     5 |
| 01/01/2010 | P        | M    | B      | X        |     4 |
| 01/01/2010 | P        | M    | B      | Y        |     5 |
| 01/01/2010 | P        | M    | B      | Z        |     5 |
| 01/01/2010 | P        | M    | C      | X        |     4 |
| 01/01/2010 | P        | M    | C      | Y        |     5 |
| 01/01/2010 | P        | M    | C      | Z        |     5 |
| 01/01/2010 | P        | M    | D      | X        |     4 |
| 01/01/2010 | P        | M    | D      | Y        |     5 |
| 01/01/2010 | P        | M    | D      | Z        |     5 |
| 01/01/2010 | P        | S    | A      | X        |     2 |
| 01/01/2010 | P        | S    | A      | Y        |     2 |
| 01/01/2010 | P        | S    | A      | Z        |     3 |
| 01/01/2010 | P        | S    | B      | X        |     2 |
| 01/01/2010 | P        | S    | B      | Y        |     2 |
| 01/01/2010 | P        | S    | B      | Z        |     3 |
| 01/01/2010 | P        | S    | C      | X        |     2 |
| 01/01/2010 | P        | S    | C      | Y        |     2 |
| 01/01/2010 | P        | S    | C      | Z        |     3 |
| 01/01/2010 | P        | S    | D      | X        |     2 |
| 01/01/2010 | P        | S    | D      | Y        |     2 |
| 01/01/2010 | P        | S    | D      | Z        |     3 |
| 01/01/2010 | Q        | L    | A      | X        |     9 |
| 01/01/2010 | Q        | L    | A      | Y        |    10 |
| 01/01/2010 | Q        | L    | A      | Z        |    11 |
| 01/01/2010 | Q        | L    | B      | X        |     9 |
| 01/01/2010 | Q        | L    | B      | Y        |    10 |
| 01/01/2010 | Q        | L    | B      | Z        |    11 |
| 01/01/2010 | Q        | L    | C      | X        |     9 |
| 01/01/2010 | Q        | L    | C      | Y        |    10 |
| 01/01/2010 | Q        | L    | C      | Z        |    11 |
| 01/01/2010 | Q        | L    | D      | X        |     9 |
| 01/01/2010 | Q        | L    | D      | Y        |    10 |
| 01/01/2010 | Q        | L    | D      | Z        |    11 |
| 01/01/2010 | Q        | M    | A      | X        |     5 |
| 01/01/2010 | Q        | M    | A      | Y        |     6 |
| 01/01/2010 | Q        | M    | A      | Z        |     7 |
| 01/01/2010 | Q        | M    | B      | X        |     5 |
| 01/01/2010 | Q        | M    | B      | Y        |     6 |
| 01/01/2010 | Q        | M    | B      | Z        |     7 |
| 01/01/2010 | Q        | M    | C      | X        |     5 |
| 01/01/2010 | Q        | M    | C      | Y        |     6 |
| 01/01/2010 | Q        | M    | C      | Z        |     7 |
| 01/01/2010 | Q        | M    | D      | X        |     5 |
| 01/01/2010 | Q        | M    | D      | Y        |     6 |
| 01/01/2010 | Q        | M    | D      | Z        |     7 |
| 01/01/2010 | Q        | S    | A      | X        |     1 |
| 01/01/2010 | Q        | S    | A      | Y        |     2 |
| 01/01/2010 | Q        | S    | A      | Z        |     3 |
| 01/01/2010 | Q        | S    | B      | X        |     1 |
| 01/01/2010 | Q        | S    | B      | Y        |     2 |
| 01/01/2010 | Q        | S    | B      | Z        |     3 |
| 01/01/2010 | Q        | S    | C      | X        |     1 |
| 01/01/2010 | Q        | S    | C      | Y        |     2 |
| 01/01/2010 | Q        | S    | C      | Z        |     3 |
| 01/01/2010 | Q        | S    | D      | X        |     1 |
| 01/01/2010 | Q        | S    | D      | Y        |     2 |
| 01/01/2010 | Q        | S    | D      | Z        |     3 |
| 01/01/1900 | P        | L    | A      | X        |     9 |
| 01/01/1900 | P        | L    | A      | Y        |     9 |
| 01/01/1900 | P        | L    | A      | Z        |     9 |
| 01/01/1900 | P        | L    | B      | X        |    10 |
| 01/01/1900 | P        | L    | B      | Y        |    10 |
| 01/01/1900 | P        | L    | B      | Z        |    10 |
| 01/01/1900 | P        | L    | C      | X        |    11 |
| 01/01/1900 | P        | L    | C      | Y        |    11 |
| 01/01/1900 | P        | L    | C      | Z        |    11 |
| 01/01/1900 | P        | L    | D      | X        |    12 |
| 01/01/1900 | P        | L    | D      | Y        |    12 |
| 01/01/1900 | P        | L    | D      | Z        |    12 |
| 01/01/1900 | P        | M    | A      | X        |     5 |
| 01/01/1900 | P        | M    | A      | Y        |     5 |
| 01/01/1900 | P        | M    | A      | Z        |     5 |
| 01/01/1900 | P        | M    | B      | X        |     6 |
| 01/01/1900 | P        | M    | B      | Y        |     6 |
| 01/01/1900 | P        | M    | B      | Z        |     6 |
| 01/01/1900 | P        | M    | C      | X        |     7 |
| 01/01/1900 | P        | M    | C      | Y        |     7 |
| 01/01/1900 | P        | M    | C      | Z        |     7 |
| 01/01/1900 | P        | M    | D      | X        |     8 |
| 01/01/1900 | P        | M    | D      | Y        |     8 |
| 01/01/1900 | P        | M    | D      | Z        |     8 |
| 01/01/1900 | P        | S    | A      | X        |     1 |
| 01/01/1900 | P        | S    | A      | Y        |     1 |
| 01/01/1900 | P        | S    | A      | Z        |     1 |
| 01/01/1900 | P        | S    | B      | X        |     2 |
| 01/01/1900 | P        | S    | B      | Y        |     2 |
| 01/01/1900 | P        | S    | B      | Z        |     2 |
| 01/01/1900 | P        | S    | C      | X        |     3 |
| 01/01/1900 | P        | S    | C      | Y        |     3 |
| 01/01/1900 | P        | S    | C      | Z        |     3 |
| 01/01/1900 | P        | S    | D      | X        |     4 |
| 01/01/1900 | P        | S    | D      | Y        |     4 |
| 01/01/1900 | P        | S    | D      | Z        |     4 |
| 01/01/1900 | Q        | L    | A      | X        |     9 |
| 01/01/1900 | Q        | L    | A      | Y        |     9 |
| 01/01/1900 | Q        | L    | A      | Z        |     9 |
| 01/01/1900 | Q        | L    | B      | X        |    10 |
| 01/01/1900 | Q        | L    | B      | Y        |    10 |
| 01/01/1900 | Q        | L    | B      | Z        |    10 |
| 01/01/1900 | Q        | L    | C      | X        |    11 |
| 01/01/1900 | Q        | L    | C      | Y        |    11 |
| 01/01/1900 | Q        | L    | C      | Z        |    11 |
| 01/01/1900 | Q        | L    | D      | X        |    12 |
| 01/01/1900 | Q        | L    | D      | Y        |    12 |
| 01/01/1900 | Q        | L    | D      | Z        |    12 |
| 01/01/1900 | Q        | M    | A      | X        |     5 |
| 01/01/1900 | Q        | M    | A      | Y        |     5 |
| 01/01/1900 | Q        | M    | A      | Z        |     5 |
| 01/01/1900 | Q        | M    | B      | X        |     6 |
| 01/01/1900 | Q        | M    | B      | Y        |     6 |
| 01/01/1900 | Q        | M    | B      | Z        |     6 |
| 01/01/1900 | Q        | M    | C      | X        |     7 |
| 01/01/1900 | Q        | M    | C      | Y        |     7 |
| 01/01/1900 | Q        | M    | C      | Z        |     7 |
| 01/01/1900 | Q        | M    | D      | X        |     8 |
| 01/01/1900 | Q        | M    | D      | Y        |     8 |
| 01/01/1900 | Q        | M    | D      | Z        |     8 |
| 01/01/1900 | Q        | S    | A      | X        |     1 |
| 01/01/1900 | Q        | S    | A      | Y        |     1 |
| 01/01/1900 | Q        | S    | A      | Z        |     1 |
| 01/01/1900 | Q        | S    | B      | X        |     2 |
| 01/01/1900 | Q        | S    | B      | Y        |     2 |
| 01/01/1900 | Q        | S    | B      | Z        |     2 |
| 01/01/1900 | Q        | S    | C      | X        |     3 |
| 01/01/1900 | Q        | S    | C      | Y        |     3 |
| 01/01/1900 | Q        | S    | C      | Z        |     3 |
| 01/01/1900 | Q        | S    | D      | X        |     4 |
| 01/01/1900 | Q        | S    | D      | Y        |     4 |
| 01/01/1900 | Q        | S    | D      | Z        |     4 |
+------------+----------+------+--------+----------+-------+

我不能将小桌子用于我的目的(我不认为),但我可以轻松使用大桌子。然而,这引入了一个次要要求:其他人现在需要能够定期检查大表是否完全包含小表中的所有信息。某人检查大表中的给定价格是否与适当的小表中的价格一致并不难,但是随着我们添加更多表和涉及更多参数,发现其他问题变得非常困难(例如,一个缺失的条目)。需要回答的问题是“能否使用大表正确查找一件衣服的所有可能价格?”。

我目前的想法是,我想设置非常容易检查的小表,并且可能自动化生成大表的过程,以便对过程的信心=>对​​大表的信心。我还想知道我是否需要大表来进行我想做的查找,或者是否有一种聪明的方法可以直接从小表中获取输出(使用聪明的数据库设计,也许?)。

也许这只是一个难题,但我想知道是否有明显优于其他解决方案的解决方案。

编辑:

感谢到目前为止所有的 cmets。不幸的是,我很难理解几个答案,而且问题似乎仍然太模糊而无法正确回答。我将尝试在已经给出的示例的上下文中充实我的问题。

在我上面的服装示例中,我是说一件服装的价格通常是销售日期、销售地点、设计师、尺寸、面料的函数。我创建了一个表格来表达这些输入和价格之间的关系。

但是,此表中的许多行并不能从所有列中受益 - 例如,对于 2010 年 1 月 1 日之前出售的任何商品,都没有对设计者的依赖。为了在我的大表中对其进行编码,我必须添加许多额外的行,以确保对于 2010 年 1 月 1 日之前出售的任何物品,对于设计师 P 的答案与设计师 Q 对于任何其他输入组合的答案相同。这似乎效率低下,但我不确定如何(或是否)可以更好地制定。我试图了解规范化的过程,但我很难了解这对这个服装示例有何作用——除此之外,我不确定规范化是否会使表格更清晰(因为这是我的主要现在的目标)。

作为额外的业务限制,我可以随时收到有关价格或新定价方法的更多信息。因此,完全可以想象,我可能必须在我的大表中添加更多输入(列),并整个加载更多行以捕获价格现在如何依赖于每个输入,即使这只会导致一两个不同的新价格点。在我的示例中,我有三个小桌子,但实际上我将有数百个。这是很多信息,没有办法解决这个问题,但我确信有一种方法可以做到这一点,不需要数百个小表或大表中的数千个基本上冗余的行。我只是在努力看看我将如何分解它。有没有一种人眼更清楚的分解方法?有没有一种方法来制定它,这意味着当出现新输入时,我不必在我的表中添加 1000 个冗余行?规范化是我需要做的吗?

我还没有完全理解已经给出的答案和资源,因此我将继续尝试消化这些内容,但希望这次编辑能够解决我所问问题的一些歧义。

【问题讨论】:

  • 举个例子会有所帮助。一般来说,单个表(关系)可以看作是一个函数;例如,表t{A,B,C,D} 是函数t::(a,b,c,d) -> Boolean,更具体的t::(a,b,c,d) -> True 表示表的行。
  • 您希望将数据库设计基于编程函数这一事实意味着您可能以错误的顺序做事。对我来说有意义的方法是从确定您试图满足的业务需求开始。设计您的数据库以满足这些要求,然后编写您的函数以便它们与该设计配合使用。
  • 看看这个stackoverflow.com/questions/1787883/…您的“小表格”不应包含定价,而应仅包含与维度相关的属性。
  • 如果您想要一个针对您的情况子集的“良好”设计示例的答案,那么您必须使用一个非常小的精确自包含示例提出一个问题,要求重点关注简单明了逻辑设计。 (为了避免“意见”和“太多可能的答案”相关。尽管“为什么”总是处于“太宽泛”的边缘。)即使这似乎不涉及代码,请阅读minimal reproducible examples。对于这个问题,我给出了一个基本的一般原则答案,重点是混淆重新“维度”以及关系和功能作为关系的概念。
  • 我刚刚找到了你的大“编辑”。 (你没有通知我。)问题并不太模糊。这是您要求教科书的几章。按照我的回答。您没有以有用的方式表征您的表格。找到你的谓词。是的,您可以从大表开始并规范化。找到它的谓词,然后是 FD,然后是 (MVDs &) JDs。如果您有特定的规范化问题,请提出。或者先找到 一些 小谓词,这些谓词说 一些 关于您的应用程序的基本内容,然后寻找更大的谓词,然后在卡住时询问。

标签: sql database database-design relational-database


【解决方案1】:

TL;DR 您的文本表格是关系和功能的图片。您需要忘记格式以及“2D”和“平面”,只需根据表格所代表的应用关系确定其值相关的维度。如果你想以某种格式显示关系,那就是用户图形界面问题。

您需要阅读并了解关系模型、信息建模和规范化。


使用关系数据库时的规范图片(但它只是一张图片)是将应用关系的所有维度放在顶部。

Price 是 P 设计的 2010 年 1 月 1 日之后尺寸 Size 与面料 Fabric 的价格

+------+--------+-------+
| Size | Fabric | Price |
+------+--------+-------+
|    S |      A |     1 |
|    S |      B |     2 |
...
|    L |      D |    12 |
+------+--------+-------+

但是等等!上面的表格是一些表格的一部分,例如:

PriceDesignerAfter 设计后的尺寸 Size 和面料 Fabric 的价格/em> AND 之后 = 1/1/2010 AND 设计师 = P

+------+--------+------+----------+----------+
| Size | Fabric | Price| Designer |   After  |
+------+--------+------+----------+----------+
|    S |      A |    1 |        P | 1/1/2010 |
|    S |      A |    1 |        P | 1/1/2010 |
...
|    L |      D |   12 |        P | 1/1/2010 |
+------+--------+------+----------+----------+

这是一些表格的一部分,例如:

PriceDesignerAfter 设计后的尺寸 Size 和面料 Fabric 的价格/em>

+------+--------+-------+----------+----------+
| Size | Fabric | Price | Designer |   After  |
+------+--------+-------+----------+----------+
|    S |      A |     1 |        P | 1/1/2010 |
...
|    M |      D |     8 |        Q | 1/1/1900 |
...
+------+--------+-------+----------+----------+

另一方面,如果该表的标签始终表示“Price 是尺寸 Size 与织物 Fabric AND Price 的价格Designer 设计的 After 之后的价格,而某些其他东西是这样的,那么我们只需要第一张桌子和这张桌子:

PriceDesigner

设计After后的价格
+-------+----------+----------+
| Price | Designer |   After  |
+-------+----------+----------+
|     1 |        P | 1/1/2010 |
...
|     8 |        Q | 1/1/1900 |
...
+-------+----------+----------+

因为能够从较小的部分重建较大的部分。

关系包含使某些谓词(即关于业务情况的参数化语句)成为真实语句的行。两个关系的join 包含将它们的谓词的“AND”变成真实语句的行。 (以及union“OR”等) 数据库设计是为了找到必要且充分的谓词来描述任何业务情况。我们根据这些基本谓词/表来描述我们希望将其视为查询的谓词/表。我们尝试简化谓词/表。我们尽量减少可以用其他(全部或部分)表达的谓词/表。我们可以在输出上以各种方式格式化。我们还确定了描述有效数据库状态(相当于可能出现的应用程序情况)的约束,以便 DBMS 可以拒绝无效的更新尝试。

在设计时,一旦我们有 一些 谓词/表可以完全描述我们的业务情况,我们会通过 规范化 使谓词/表尽可能小和独立,它基于 功能依赖和加入依赖。信息建模方法通常会尝试生成已经至少有些标准化的基本谓词/表。

函数依赖涉及谓词/表,其中列是其他列的函数。连接依赖关系涉及使用“AND”的谓词/表。 (每个函数依赖都带有一个连接依赖。)规范化包括用较小的谓词/表替换谓词/表,以消除有问题的函数和连接依赖。

【讨论】:

    【解决方案2】:

    作为额外的业务限制,我可以随时收到有关价格或新定价方法的更多信息。因此,完全可以想象,我可能必须在我的大表中添加更多输入(列),并整个加载更多行以捕获价格现在如何依赖于每个输入,即使这只会导致一两个不同的新价格点。在我的示例中,我有三个小桌子,但实际上我会有数百个

    我认为这是一个危险信号,告诉您纯粹的关系存储机制对您来说效果不佳。

    老实说,我不确定适当的机制是什么,但您似乎需要能够将产品和日期传递到函数中,然后使用业务规则来确定适当的价格,因此我认为您需要像业务规则引擎这样的东西。

    【讨论】:

    • 抱歉,大卫,我说“随时”可能误导了您,我认为这可能会影响您的回答。在此过程的初始设置过程中,我经常发现新的定价表(例如,每隔几周就会显示一个新的输入),但我预计这将在大约 6 个月左右的过程中逐渐减少,直到我有一组或多或少完整的小桌子。之后,可能每隔几年就会出现一张新表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2012-06-03
    • 1970-01-01
    • 2020-08-31
    相关资源
    最近更新 更多