【发布时间】: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