【发布时间】:2012-09-22 16:17:13
【问题描述】:
我有一个 Access 数据库,需要在一行上显示具有多个一对多关系的数据(例如,它将项目列为“a、b、e、f”,并且我将有多个列像那样)。我知道以这种方式存储数据也是一个坏主意,但考虑到我允许用户过滤其中的几个列,我想不出比违反第一个范式更好的处理数据的方法.
举个例子:假设我有几篇期刊文章,每篇文章都可能报道多种动物和多种蔬菜。用户可以过滤源名称,或者他们可以过滤一种或多种动物和一种或多种蔬菜。输出应该看起来像
Source name....animals...............vegetables
Source 1.......dogs, cats, birds.....carrots, tomatoes
Source 2.......leopards, birds.......tomatoes, zucchini, apples
Source 3.......cats, goldfish........carrots, cucumbers
通常您会有一个单独的表格,其中包含源名称 + 动物:
Source name......animal
Source 1.........dog
Source 1.........cats
Source 1.........birds
Source 2.........leopards
等
还有一张类似的蔬菜表。但考虑到数据需要如何呈现给用户(逗号分隔的列表),以及用户如何过滤数据(他可能会过滤以仅查看包括狗和猫的源,以及带有胡萝卜和西红柿的源),我认为将数据存储为动物和蔬菜的逗号分隔列表是有意义的。使用逗号分隔的列表,当用户选择多种蔬菜和多种动物时,我可以说
WHERE (Vegetables like "*carrots*" and Vegetables like "*tomatoes*") AND (Animals like *dogs*" and Animals like "*cats*")
如果不使用大量 VBA 和多个查询,我想不出一种在 Access 中执行相同类型查询的有效方法。
【问题讨论】:
-
通常至少有一个很好的理由来打破任何规则。我觉得 Access 有时很难使用,有时它在最初和考虑长期没有完全关系数据库模式时要容易得多。不过,这真的取决于。我曾经不得不对 Access DB 进行反规范化,因为由于 3NF 设计,一些报告变得非常复杂。但是,我认为这可以在没有任何 VBA 和规范化设计的情况下完成。
-
当然希望您不必在数据库中跟踪草原土拨鼠。
标签: sql database ms-access database-normalization