3

如果您能充分解释或指出我的方向,我将不胜感激。

我正在尝试创建一个存储企业的数据库,并将它们列为在当地开展的活动。以分层形式,我想将它们存储为:

活动类别

  • 活动子类别
  • 活动

  • 活动类别是:室内、户外、艺术……等

  • 活动子类别将是:水族馆,博物馆,公园......等

  • 活动将是子类别的列表:佛罗里达水族馆,大英博物馆..

假设我使用上面的 3 个名称作为我的表格,正确的关系是什么?在 ActivitySubCategory 表中,我是否会创建一个与 ActivityCategoryID Pk 相关的 FK?我会在与 ActivitySubCategoryID PK 相关的 Activity 表中创建一个 FK 吗?

4

4 回答 4

3

由于您最终可能会建立多对多关系(例如,艺术有许多子类别,但英国博物馆可能在艺术和室内),您应该添加一个 Join 或 Link 表,其中仅包含活动表和子活动表中的 ids 值。确保将两者都用作PK,这样您只能将每个组合输入一次。

于 2013-02-18T22:47:12.000 回答
2

每个活动是否只有一个类别?我的建议是创建一个 Activity 表,然后创建一个带有 ParentCategory 列的 Category 表 - 这将是一个自引用连接。

如果一个活动可以只有一个类别,那么一个简单的 FK 关系就足够了。如果没有,那么您需要第三张表作为关联。

于 2013-02-18T22:47:39.233 回答
1

扩展其他答案并让您深入了解我如何解决此类问题。

数据库结构是我考虑的最后一件事。归根结底,RDMS 是一个数据存储——当您不使用它们时,它会保存在其中。

首先考虑您正在建模的现实世界问题。现实世界的对象将被建模为软件对象——哪些属性是必不可少的,以及使这些对象进化所需的方法。一旦你有了这个结构,数据库模式就会自然而然地消失。

对于您的问题,您有两个现实世界的东西;活动和类别。忽略它们的独特属性,考虑这些对象如何交互。

活动

  • 活动总是在一个类别中吗?
  • 只有一类?
  • 它可以在类别之间移动吗?
  • 如果是这样,它是否需要知道它在哪里?
  • 什么时候?
  • 它是否始终是子类别的一部分,还是可以直接附加到某个类别?

类别

  • 层次结构中是否只有 2 个级别,或者可能有子子类别?
  • 子类别只会成为一个类别的一部分吗?
  • 他们可以在类别之间移动吗?
  • 如果是这样,它是否需要知道它在哪里?
  • 什么时候?
于 2013-02-18T23:13:50.037 回答
1

您可以按照建议创建外键:

  • FK 从 ActivitySubCategory 到 ActivityCategory PK
  • FK 从 Activity 到 ActivitySubCategory PK

但是,这会将您的活动限制为仅一个子类别。如果您需要将活动与多个子类别相关联,那么您应该创建一个查找表,其中包含活动和 ActivitySubCategories 的外键。

如果您设想任何更多可能的类别级别,您可以创建一个自身具有 FK 的单个 ActivityCategories 表。这将是同一个表的行之间的父/子关系,因此您可能希望创建引用 ActivityCategories.PK 的 ActivityCategories.ParentKey。顶级 ActivityCategory 将有一个 NULL ParentKey。

此外,我建议在外键上创建索引。例如,在 Activity.ActivitySubCategoryKey 和 ActivitySubCategory.ActivityCategoryKey 上创建索引。如果您不这样做,删除活动类别或子类别可能需要很长时间。

于 2013-02-18T22:49:15.497 回答