数据库设计:解释这个模式

16 浏览
0 Comments

数据库设计:解释这个模式

完全透露一下...我正在努力学习更多关于数据库的知识,所以我花了时间,并试着从源头获取答案,但没有成功。

Barry Williams来自databaseanswers网站上发布了这个模式。

客户和费用模式

alt text

我试图理解此模式中地址表的拆分。很明显,Addresses表包含了给定地址的详细信息。而Client_Addresses和Staff_Addresses表让我困惑。

1)我理解使用主外键的用法,但我以为当使用这些时,在同一表中就不需要有一个常驻的主键(在这种情况下是date_address_from)。有人能解释一下这两者的原因,并用文字说明它是如何实际运作的吗?

2)为什么要将date_address_from作为主键,而不是像client_address_id这样的PK?如果有人在一天内输入了两个地址,那么在他的设计中会发生冲突吗?如果会或者不会,那么会发生什么?

3)在归一化的路线上...既然Client_Addresses和Staff_Addresses表中的date_address_from和date_address_to是相同的,是否应该将这些字段不包含在主Address表中?

0
0 Comments

这段对话讨论了一个数据库设计的问题,即关于如何更好地表示客户和员工的地址信息。其中,一个人提出了一个问题,即既然客户地址和员工地址在Client_Addresses和Staff_Addresses表中是相同的,那么是否应该在主Address表中不包含这些字段。然后,其他人对这个问题进行了解答和讨论。

在讨论中,有人指出设计者将客户和员工视为完全不同的实体,即它们没有任何共同的属性。然而,实际上客户和员工都有地址和电话等共同属性。如果一个人既是员工又是客户,那么他的姓名和地址信息会被存储在多个地方,这会导致数据更新的异常情况。

问题的原因在于设计者将客户和员工视为不同类型的人,而实际上它们只是不同类型的关系。"客户"描述了服务提供者(通常不是零售商)和顾客之间的业务关系,顾客可以是个人或公司。"员工"描述了公司和个人之间的雇佣关系。因此,解决方法是重新设计表格,将客户和员工归为同一类型的人,通过添加一个连接表来标识一个人是"客户"、"员工"还是两者兼有。

此外,还某些情况下了地址的问题,指出地址通常不包含"lines",而邮寄标签才包含"lines"。某些情况下了在这种情况下,模拟邮寄标签而不是地址的好处。不同的业务可能需要模拟地址或邮寄标签,具体取决于业务的需求。

这段对话讨论了数据库设计中关于客户和员工地址的问题,并提出了将客户和员工归为同一类型的解决方案,以及模拟地址或邮寄标签的选择。

0
0 Comments

问题的出现原因是数据库设计中的主键选择不合理。在每个表中,主键是由三个属性组成的复合键:(staff_id, address_id, date_address_from)和(client_id, address_id, date_address_from)。这似乎意味着客户/员工与地址的映射预计会随时间变化,并且这些变化的历史记录会被保留。

然而,没有明显的理由在这些表中创建一个新的"id"属性。复合键已经足够完成工作。为什么要在同一日期为同一客户创建两次相同的地址呢?如果确实需要这样做,那可能是修改设计的原因,但这似乎是一个不太可能的需求。

解决方法是去除这些表中的"id"属性,并只使用复合键作为主键。这样可以简化设计,并确保不会出现重复的地址记录。

@dportas,我对您在这里所说的意思还需要进一步澄清。您所说的日期是否是按照Dani在回答中提到的方式与客户进行映射的,即同一人在不同时间拥有多个住所?您对问题1和问题2的回答对我来说已经很清楚了。谢谢。

0
0 Comments

数据库设计:解释这个模式

问题:这个模式存在的原因是什么?如何解决?

在这篇文章中,我们将讨论一个关于数据库设计的问题,并提供解决方法。首先,让我们来看看问题出现的原因。

原因:

1. 这个模式不是一个数据模型,也不是一个数据库。它只是一个鱼桶,每条鱼都被画成一个矩形,如果一条鱼的鳍被另一条鱼的鳃卡住,就会有一条线。这里有大量的重复,以及大量缺失的元素。从这个模式中学习数据库设计没有任何价值。

2. 没有进行任何规范化;文件非常不完整。"other_details"和"eg.s"让人捧腹大笑。每个元素都需要被识别和存储,而不是像"line_1_number_street"这样的组。顾客和员工应该被规范化为一个人员表,并且所有的元素都应该被识别。

3. 这实际上是一堆扁平文件,带有字段组的描述。离数据库或关系型数据库相差甚远。还没有准备好进行评估或检查,更不用说构建任何东西了。在关系数据模型中,这将是大约35个规范化表,没有重复的列。

4. 作者在网络上有超过500个"模式"。当您尝试使用第二个"模式"时,您会发现:a) 它们在使用和目的方面完全不同;b) 它们之间没有共同之处;c) 假设两个模式中都有一个客户文件;它们将是不同形式的客户文件。作者首先需要对整个单一的"模式"进行规范化,然后将单一规范化的数据模型分为500个部分或主题领域。

5. 这个模式使用了一些无法识别的图表约定。这些有趣的图表传达了一些信息,但它们并没有传达数据库或设计的重要信息。对于有经验的数据库专业人士来说,这并不令人意外,但对于学习者来说,这是令人困惑的。建模关系数据库和数据模型的符号标准是有原因的:它们传达了设计的所有细节和微妙之处。

6. 作者还有很多东西没有读过:命名约定、关系、基数等等,太多了无法列举。

解决方法:

1. 作者在没有明确说明的情况下使用了复合键。"client_addresses"的主键是"client_id, address_id, date_address_from"。这不是一个坏的键,显然作者希望永远记录地址。

2. 保持地址在一个单独的文件中的想法是好的,但是作者没有提供存储规范化地址所需的任何字段,所以"模式"将会完全重复地址;在这种情况下,作者可以删除地址,并将行放回客户和员工文件中,同时保留它们的"other_details",从而删除三个完全没有用处的文件。

3. 这些不是关联表或文件;它们包含数据字段。关联表用于解决数据库中的多对多关系,而列只包含父表的主键。

4. 关于第三个问题,一个人在同一天注册在多个地址的想法是不合理的;只需统计他们在最常住的地址即可。

这个模式中没有任何关于数据库、设计或规范化的证据。如果想学习关于数据库和数据库设计的知识,最好找到一个有资质、有能力的人,并向他们学习。

答案:

在这个问题的答案中,我们将讨论一些关于使用复合键和地址重复的问题。以下是解决方法:

1. 作者使用了复合键,但没有明确说明。"client_addresses"的主键是"client_id, address_id, date_address_from"。这是一个不错的主键,作者显然希望能永久记录地址。

2. 保持地址在一个单独的文件中的想法是好的,但是作者没有提供存储规范化地址所需的任何字段,所以"模式"将会完全重复地址;在这种情况下,作者可以删除地址,并将行放回客户和员工文件中,同时保留它们的"other_details",从而删除三个完全没有用处的文件。

希望这些解决方法对您有所帮助。如果您需要更多关于数据库设计的信息,建议您寻找有资质、有经验的人,并向他们学习。

0