0

我是数据库设计的新手,我一直在练习尽可能多的问题。我碰巧遇到了以下问题(不,这不是我的任务!)据我所知,我创建了附加的概念模型。模型中缺少一些信息,因为从需求来看,我不清楚应该在哪里添加它们。我已经突出显示了我有疑问的行。

您的任务是设计一个数据库模式,该模式捕获为游客提供设施审查服务所需的信息,用于住宿、餐馆和计划旅行等设施。关于住宿,该服务会保存有关姓名、地址和住宿类型的信息。住宿类型可以是酒店、旅馆或住宿加早餐旅馆。我们还需要姓名和地址。还有一组可选的设施(应单独列出),例如房间类型(单人房、双人房或多人房)、房间内是否有电视、浴室等。可以使用多个设施到同一个地方。还有每晚的费用,可以按每人(旅馆)或每间客房(旅馆、床和早餐;因此,取决于住宿类型)指定。
对于吃饭的地方,我们有名称和地址(唯一且始终可用)。它们可以是餐馆、酒吧、酒馆、小酒馆和自助服务。应指定菜肴的种类、每餐的平均成本(分为 4 个可能的成本级别)、每日时间表(由开放和关闭时间组成)以及可选的一周中的停止天数(一天或多天) . 关于旅行,我们要指定景点名称列表(以及相应的地址,如果有的话)。对于每个旅游景点,我们都有游客访问它们的日期间隔。每个客户都可以自由文本评论每个地方(住宿或吃饭的地方,但不是旅游旅行),指定他/她的昵称(对所有客户来说都是唯一的),访问日期(或者日历间隔由两个日期指定)和一个整数分数(从 0 到 5)。每个客户可以多次访问同一地点并留下评论。绘制数据库概念设计的 ER 图。

这就是我想出的: 概念模型

该图像具有我能想到的模型。我的疑问是:

1)我的方法使用这么多概括是否正确?还有其他方法吗?

2)在上面的描述中,斜体和粗体的第一句话表示存在某些“可选的设施集”。这些属性应该添加到酒店、旅馆和 B&B 实体还是一般化的住宿实体?

3)在突出显示的第二句话中,是否应该像我一样将成本添加到酒店、旅馆和 B&B 中?否则,我应该如何进行建模?

4)在第三个突出显示的句子中,指定的属性应该列在每种类型的餐馆下还是应该添加到广义实体 Eatery 中?

非常感谢您提前提供的帮助!

4

1 回答 1

0

我的方法使用这么多概括是否正确?还有其他方法吗?

当然还有其他方法。泛化并没有错,尽管在一个模型中很少看到这么多泛化。这并不意味着它的错误,在这种情况下,正确和错误取决于您的模型代表业务需求的程度。

在上面的描述中,斜体和粗体的第一句话表示存在某些“可选的设施集”。这些属性应该添加到酒店、旅馆和 B&B 实体还是一般化的住宿实体?

这听起来像是一般要求,我会将其与住宿联系起来。

请注意,在给定的场景中,“设施”有两种用法 - 用于可以访问/查看的地方,以及用于房间的功能。我建议重命名其中一个术语以避免混淆。

在突出显示的第二句话中,是否应该像我一样将成本添加到酒店、旅馆和 B&B 中?否则,我应该如何进行建模?

您可以按照以前的方式进行操作,或者将成本属性(以及每人/房间指示器)添加到住宿。

您应该尽量避免在属性中混合域。我的意思是所有可能的值都应该是相同的类型并且在逻辑上可以互换。一种常见的情况是在一个属性或 EAV 表中的值列中混合不同货币的值。这样的设计往往会增加复杂性。

向住宿添加成本属性具有相似的味道,将每间客房的成本和每人的成本结合在一个属性中。尽管如此,如果它可以消除一组子类型,我会考虑它 - 如果我们没有特定于子类型的属性、关系或约束,则类型可以由属性指示,从而减少显式建模每个子类型的需要。

在第三个突出显示的句子中,是否应在每种类型的餐馆下列出指定的属性,还是应将它们添加到广义实体 Eatery 中?

我认为没有理由为每个餐馆单独列出它。所有子类型共有的属性、关系和约束应该与超类型相关联。

为了比较,这是我的模型。我在看你的之前就这样做了,所以它采用了一种非常不同的方法。

设施审查 ERD

一些注意事项:

  • 我将房间设施重命名为功能
  • 住宿和餐厅是设施的可选不相交子类型。这意味着我们可以拥有不属于任何一个子类型的设施,允许我使用相同的结构处理其他类型的旅游景点的评论。
  • 访问是三元关系,由用户、旅行和设施确定。因此,每个访问都必须属于一个行程,即使它只是一次访问行程。从好的方面来说,多个用户可以参加同一次旅行。
  • 用户可以在不同的行程中多次访问设施,但每次行程不能超过一次。我们可以将访问从关系转换为具有代理键的实体来克服这个问题。

我希望这会有所帮助,让我知道是否应该澄清任何事情。

于 2017-07-05T06:51:30.263 回答