【问题标题】:Access database design - Normalizing out two separate (and related) fieldsAccess 数据库设计 - 规范化两个单独(和相关)的字段
【发布时间】:2015-03-23 02:14:22
【问题描述】:

我创建了一个数据库来存储我公司从事的设计工作的信息。主表目前有很多 Null 字段,因为有很多“可选”字段......据我了解,这是规范化的主要候选者!

我的问题更多来自对结构的理解。我会尽力解释我的问题:

在主表中,有条目(我的 PK)和许多分组选项(一个 Y/N 和一个备忘录)。该文本是可选的,但仅当相关的 Y/N 设置为“是”时。一个简单的例子如下(在 Excel 中做了一个快速模型):

请记住,除了这些之外,还有更多选项(以及更多空值)。我想将这些规范化为 2 个新表,但结构超出了我的技能水平。理论上它看起来像这样:

这会将 Y/N 和文本分开,通过原始选项编号将两者关联起来,并去掉我所有的空值。

但在结构上,我不知道如何设计一切。我想我需要一个连接表,但“订单和产品”的标准教程示例并不完全适合我正在尝试做的事情(或者至少,我看不到它)

另外一个问题,如果相应的“OptionA”中存在“是”,我只需要接受“OptionB”的记录。我可以使用原始表中的验证规则进行设置,但我不确定在拆分字段时是否可以使用相同的方法。

我也不知道如何为后两个表设置我的键 - “条目”和“选项”都需要能够有重复项,但我需要停止 unique 的重复项这两个字段的组合(应该只有一个带有“条目 1|选项 1”的记录)

这很罗嗦,我希望它是有道理的......我很乐意提供任何进一步的澄清。

【问题讨论】:

  • 我还想到,也许我不需要规范化 (Y/N) 字段,因为这并不会真正导致“空”条目,但问题仍然存在如果我只取出文本字段 - 即如何将它们关联回原始记录,如何索引它们,如果我需要一个联结表,等等。
  • 您使用的是哪个版本的 Access?这对于“额外的扭结”部分很重要。
  • 嗨,克里斯,Access 2010
  • 谢谢。我最初读到你说有一个选项可能取决于有另一个选项(例如,选项 2 仅在选项 1 被采用时才适用),但再读一遍,我不确定情况是否如此。你能确认一下吗?
  • 确认,选项2独立于选项1;相反,如果选项 1A 为“否”,则选项 1B 必须为空

标签: database ms-access primary-key normalization junction-table


【解决方案1】:

您自己已经完成了大部分工作。假设选项都是独立的(即,只有当另一个选项已设置时,一个选项才可设置),此外,选项的状态是“是”或“否”而不是潜在的“未知”(不同于“否” ') 相反,您可以这样做:

Entries

FIELD NAME      DATA TYPE   ATTRIBUTES
EntryID         AutoNumber  PK; required
EntryName       Text        Unique; required

Options

FIELD NAME      DATA TYPE   ATTRIBUTES
OptionID        AutoNumber  PK; required
OptionName      Text        Unique; required

EntryOptions

FIELD NAME      DATA TYPE   ATTRIBUTES
EntryOptionID   AutoNumber  PK; required
EntryID         Number      FK to Entries.EntryID: required
OptionID        Number      FK to Options.OptionID; required

Unique index combining EntryID and OptionID

EntryOptionText

FIELD NAME      DATA TYPE   ATTRIBUTES
EntryOptionID   Number      PK; FK to EntryOptions.EntryOptionID; required
OptionText  Text            Required

我不确定您的“选项 1”、“选项 2”等是否只是标记,但无论哪种方式,设置一个“显示名称”字段都是明智的,因为自动编号字段看起来像一个计数器(一旦你开始删除中间的记录,它就会变得不连续)。

外键

您可能很清楚,这些是使用向导或在 Access 的“关系”窗口中设置的:

  • Entries 将与 EntryOptions 建立一对多关系
  • Options 将与 EntryOptions 建立一对多关系
  • EntryOptions 将与 EntryOptionsText 具有一对一的关系

我个人觉得EntryOptionsText 有点矫枉过正——我只是将OptionsText 作为EntryOptions 中的一个可空字段。

唯一索引

希望在每个显示名称字段上创建唯一索引的基本原理非常明显。关于我建议反对EntryOptions 的方法,即涵盖EntryIDOptionID,这将是您的“额外扭结”的解决方案,防止多个记录具有相同的EntryID/OptionID组合。

设置单字段索引很简单,因为在设计表格时前面有“索引”字段属性(将其设置为“是(无重复)”)。对于涵盖两个字段的索引,请转到“设计”功能区选项卡,选择“显示/隐藏”>“索引”,然后显式创建索引(请参阅 https://support.office.com/en-gb/article/Create-and-use-an-index-to-improve-performance-0a8e2aa6-735c-4c3a-9dda-38c6c4f1a0ce)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 2014-07-09
    • 2013-01-18
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多