SQL关系型数据库设计

3
如果您能够完全解释,或者指引我方向,我将不胜感激。
我正在尝试创建一个数据库,将企业存储并将它们列为当地周边活动。按层次形式,我想将它们存储为:
活动类别
- 活动子类别 - 活动 - 其中活动类别可以是:室内、户外、艺术等等 - 其中活动子类别可以是:水族馆、博物馆、公园等等 - 其中活动可以是子类别的列表:佛罗里达水族馆,大英博物馆等等
假设我使用上述三个名称作为我的表,那么正确的关系是什么?在ActivitySubCategory表中,我是否应该创建一个与ActivityCategoryID主键相关联的FK?我是否应该在Activity表中创建一个与ActivitySubCategoryID PK相关联的FK?

1
我听说过这本书,名为《Database Design for Mere Mortals》。它将教会你基础知识,剩下的就取决于思考了。 - Dan Bracuk
4个回答

3

由于艺术活动可能涉及到多个子类别,比如英国博物馆可能属于艺术和室内两个子类别,因此很可能会出现多对多的关系。为了解决这个问题,您需要添加一个连接表,该表仅包含来自活动表和子活动表的 id 值。请确保使用两者作为主键,以便您只能一次获取每个组合。


我之前一直认为是一对多的情况,你的回复让我省去了很多麻烦和几个小时的时间。非常感谢你的回复和付出的时间。 - KRob

2

每个活动是否只有一个类别?我的建议是创建一个活动表,然后再创建一个类别表,其中包含一个父类别列-这将是自引用连接。

如果一个活动只能拥有一个类别,则只需要一个简单的FK关系。如果不是,则需要第三个表作为联合表。


是的,每个活动只会有一个类别。感谢您的提议和时间。 - KRob

1
您可以按照您的建议创建外键:
  • 从ActivitySubCategory到ActivityCategory PK的FK
  • 从Activity到ActivitySubCategory PK的FK
然而,这将限制您的Activity只能属于一个子类别。如果您需要将活动与多个子类别关联起来,则应创建一个查找表,其中包含对Activities和ActivitySubCategories的外键。
如果您预计有更多可能的类别级别,则可以创建一个单独的ActivityCategories表,该表具有对其自身的FK。这将是相同表中行之间的父/子关系,因此您可能希望创建ActivityCategories.ParentKey,它指向ActivityCategories.PK。顶级ActivityCategory将具有NULL ParentKey。
此外,我建议在您的外键上创建索引。例如,在Activity.ActivitySubCategoryKey和ActivitySubCategory.ActivityCategoryKey上创建索引。如果不这样做,删除活动类别或子类别可能需要很长时间。

第一篇帖子让我意识到了你刚才提到的将Activity限制在一个子类别中的做法。我不确定你提到的ActivityCategories表是否有一个指向自身的FK,但从概念上讲,这对我来说是有意义的。您能否立即提供一些资源供我进一步阅读?感谢您的时间,Williams先生。 - KRob

1
为了更好地解决这类问题,我会进一步阐述其他答案并给你一些见解。
数据库结构是我考虑的最后一件事。归根结底,关系型数据库管理系统(RDMS)是一个数据存储库——它是在不使用它们时保存东西的地方。
首先,考虑你要建模的真实世界问题。真实世界中的对象将被建模为软件对象——哪些属性是必需的,哪些方法是需要使这些对象发展的。一旦你有了这个结构清晰,数据库模式就自然而然地出现了。
对于你的问题,你有两个真实世界的事物:活动和类别。忽略它们的独特属性,考虑这些对象如何相互作用。 活动
  • 活动是否总是属于某个类别?
  • 只属于一个类别吗?
  • 可以在类别之间移动吗?
  • 如果可以,它需要知道它所在的位置吗?
  • 以及什么时候?
  • 它总是属于子类别,还是可以直接附加到类别上?
类别
  • 层次结构中只会有两个级别,还是可能有子子类别?
  • 子类别只会属于一个类别吗?
  • 它们是否可以在类别之间移动?
  • 如果可以,它需要知道它曾经在哪里吗?
  • 还有什么时候?

一旦我获得了15个声望,我就将对此进行标注。这是第一个问题,我没有问自己正确的问题;猜想我会重新阅读《代码大全》或其他“如何像程序员一样思考”的书籍。谢谢您的时间。 - KRob
@KRob,我看到你的声望是16。努力跟上啊,好吗?:^) - Dan Bracuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接