致谢
我不得不说,您在 (a)掌握上一个问题中提供的建模元素和 (b)应用它们方面做得非常出色。你在一天之内走了很长一段路。这是一个美妙的事实,即,给予正确的教育,有能力的人有能力做伟大的事情,发挥自己的力量。
方法
鉴于您声明的目标和您展示的能力(更不用说,我在 SO 上处理的第一个寻求者,对于发布 ERD 而不是一堆 DDL 的 Db Design 问题),我不会提供答案。我会给你方向和指导,你必须改进自己的模型。
当然,我也会介绍具体内容,但我会完整介绍一两个学科领域,而不是全部。您可以选择它并将其应用于所有主题领域。
我没有回应核心主题领域,因为我们仍在处理识别实体。解决后Reviews
,等会更容易;交易实体取决于识别实体。
方向
D.1) 我知道我说过我需要查看整个模型。有一个例外。历史或时间或审计数据(例如,编辑和存储的版本)。在这个早期阶段,它们可以被搁置;在逻辑模型完成之前实施。这是因为(a)它们是一些父级的简单依赖项(b)需要首先对所有其他表进行建模,以及(c)排除不必要的复杂性,从而使我们能够专注于相关的场地。
- 特别是,您可以忽略动词短语中的时态(否则版本表的每个位置都需要
Has/Had
)。暂时保持现在时,因为重点是建模,而不是归档。
未解决
U.1) Optional Parent
完全不允许。不仅是 IDEF1X,而是任何完整性概念。如果定义了 FK 引用,则必须有父级。要允许可选的父级,必须删除(或不实施)FK 引用。根据定义,这样的条件将排除结果作为“关系数据库”的资格。例如。Address:Order
.
- 当然,在发达国家,出于法律或税收的原因,
Order
必须要有一个;Address
这与标准要求问题是分开的。
.
U.2) 事件
Party::PartyAddress
正确;Address::PartyAdress
是正确的。Event::Address
需要工作。地址是一个识别参考表;如果使用,它将是父母,Event
将是孩子。我把它留给你来识别/建模多个Events
到一个位置,以及Events
在一个或多个位置。
U.3) 假设Catalog
是传统意义上的条目(JCPenney 2011),即出售或出租的物品清单。
OrderSaleItem
是正确的
临界点。Catalog
是 Dependent,并且只能Band
作为 Asset 存在于 a 的上下文中。美好的。这意味着数据库中没有除 Band 商品以外的商品。正确的 ?
我可以看到“与布鲁斯兄弟的晚间表演”是Event
如何可以订购、开票和付款的。还审查,评论等。
我看不出如何Song
适应它。乐队是在销售专辑、歌曲还是两者兼而有之?
有没有其他乐队商品:音乐会/活动纪念品;海报; 刻花眼镜?
与您引用的命名约定以及数据库的其余部分一致,Catalog
(内容)应命名为Item
(行)。您已经(自然地?)在OrderSaleItem
,( 而不是OrderSaleCatalog
.
U.4) 类型
U.5) Favorite
的基数Item::Favorite
被颠倒。当您更正该问题时,Favorite
主题区域将需要进一步建模。
同一对实体之间的循环关系或双重路径是未解决模型的信号。通常一个是正确的,另一个是多余的。(有例外,但不是在这里;当这种情况发生时,动词短语会区分它们。)
Band::Favorite
xor中的任何一个Item::Favorite
都是正确的,而不是两者都正确。
Item::Favorite
似乎是正确的,因为Band
已经在Item
同样,Favorite
乐队和商品的一个实体听起来也不可靠。Favorite
单个实体中的每个标识符都是一个Party
. 当我们规范化时它会中断,还不如要求在这个阶段澄清标识符。它要么是一个具有某种区分形式的实体 ( FavoriteType
) 来确定其处理方式;要么 或者一个Favorite
用于乐队,另一个用于商品,在这种情况下不需要区分,消除了歧义。
U.6) 商业规则 这可能是你唯一薄弱的领域。一般反应。您已经分别完成了任务(所有建模与编写 BR)。这些与模型不匹配。当您经历下一个周期时,将业务规则作为指令,并同时调整它们,就像实体、关系和动词短语一样。
问题
Q.1) 用户/朋友
你完美地掌握了它的本质。以及关系的基数。(对此进行全面处理。)这对于 Accepted 是正确的Friend
。
Q.2) a 的依据是Person is zero-to-many Users
什么?
小问题
M.1) 仅单数。
M.2) Party Has zero-to-many Addresses
。我认为他们必须有一个,以便进行业务交易(但也许不是全部Users
)。
M.3) Order May Have zero-to-many Payments
。“需要”意味着 firstPayment
必须与Order
.
- 同样,对于任何强制子代(一对多而不是零对多),第一个子代必须与父代同时插入。这是通过企业数据库中的事务完成的,因为实现了即时约束检查(不是延迟);小镇的小尽头为诸如延迟约束检查之类的愚蠢事情而争吵“更好”,然后花费他们的一半时间来弄清楚如何不陷入他们创建的无限循环中,从而使他们陷入困境。MyNonSQL 根本没有,因此无需担心此实现。
M.4)OrderSaleItem
应该是OrderItem
xorOrder
应该是OrderSale
. 取决于你OrderPurchase
对未来的设想。
▶学科领域示例◀
不熟悉关系数据库建模标准的读者可能会发现▶IDEF1X Notation◀很有用。
如前所述,我不提供完整的数据模型,仅提供指导。这只是一个选定主题领域的进展。它在任何方面都不“正确”或不完整。
好的,所以继续改进模型,然后再次发布(只需编辑问题,留下标题段落,然后替换其余部分)。
V1.1 和响应
这当然是一个进步。
我以伪法律格式重新编号了项目,包括章节标题,以便我们可以在整个过程中保持编号,并不断添加。实际上,它也确实缓解了 SO 编辑问题。
U.3)是否需要对目录部分进行全面修改,或者只需要与乐队存在的识别关系?
尝试了一个模组来销售完整的专辑或歌曲。无论哪种方式,它们都是电子格式,仅供下载。这就是为什么我将专辑列为由歌曲组成的原因
而不是 2 个独立的实体。
U.5) ...但我不清楚如何做。我在这里想念什么?
一个具有差异化的实体的示例是您拥有的任何超类型/子类型集群。Favorite 是超类型,BandFavourite 和 ItemFavourite 是子类型;允许每个分别引用 Band xor Item。
您已经为 ItemFavourite 建模。现在的问题是,ItemFavourite 的事实是否意味着该乐队是最喜欢的?还是 BandFavourite 是一个离散的事实?在示例中,我对后者进行了建模,没有 Favourite::ItemFavourite/BandFavourite 结构。
Q.1)是的,我希望接受、拒绝和阻止。我不确定您指的是如何改变逻辑模型?
对于前者,我们有额外的状态:
Blocked
.
- 然后动词短语需要更改(为了清楚起见,我将包括 RoleName),其中一个具有替代含义。.
- (在属性级别模型中会更清楚,这就是为什么我们用图片而不是文字来建模的原因;所以我已经包含了它。)
Q.2)一个人不必是用户。他们只能作为乐队成员存在。这就是你要问的吗?
M.3)我需要阅读更多关于约束检查的内容,以确保我理解了一些事情。
- 现在不用担心;我给了你保持简单的理由(NonSQL 似乎简化了事情,但实际上它们使它变得更复杂)。MyNonSQL 没有这些功能,因此您可以消除对平台的考虑,只对 Cardinality 进行有意义的建模。
M.4)取决于您是否设想未来的 OrderPurchase。你能扩展一下你的意思吗?
1.1版
U.2) 事件进展
EventDate 看起来不错。我会将关系定义为Event Was Perfromed On EvenDate
。
虽然 ItemGenre 是完美的,但 Event::Venue 需要工作。这是您一贯犯的错误,因此需要做出解释。
您已正确建模Venue
,它是独立的,并且确实存在于Event
. 但是Event May Be [Held] At zero-to-many [Independent] Venues
是不可能的。
活动在许多场地举行,场地举办许多活动。如果就是这样,既然这是逻辑层,你可以画一个多对多的关系,你就完成了。在物理级别,通过实现关联表来解决该关系,其中 PK 是两个父 PK,并且没有数据。(敌人就是一个很好的例子。)
但是如果有数据(例如,您需要跟踪参加者的日期或人数等),那么它就不是关联表,而是另一个实体。发生在 Event 和 Venue 之间的事情。
EventDate 是一个不错的选择。我们已经有了它和日期。只需添加场地并搅拌。我将在事件和场地之间发生的事情称为表演。
同样,EventAddress 已取得进展,但尚未完成。
M.5) 子流派。你能解释一下为什么 SubGenre (a) 独立和 (b) Relation is Non-Identifying。
M.6) Item Is zero-to-many Favourites
。因此:Item Is a Favourite of zero-to-many Users
。同样,Each User Chooses zero-to-many Favourites
. 因此Each User Chooses zero-to-many Favourite Items
。
V1.2 和响应
大进步。
U.2) 事件进一步推进
根据您的编辑以及新的要求,有些是,有些不是。数据模型的所有其他主题领域都非常完整(对于逻辑),这一领域很混乱,几乎没有解决。部分是因为增加了要求(没有抱怨,这发生在现实生活中;这是关于你如何处理它)。
我要在这里提出的主要观点是,数据模型应该始终对现实世界进行建模,而不仅仅是业务需求。(a) 将 DM 与变化的影响隔离开来,并且 (b) 为增加的需求提供了一个坚实的平台。这并不意味着您必须对整个现实世界进行建模,但您所建模的部分必须反映现实,而不是为了满足需求而被压扁。
其次,Event、Band-Event、Performance 等之间的区别并不清楚。现在,Event 是 Party-Band-Item-Event。这很好,但它不适用于按要求的新样式事件。
第三,您对 Address re Party 和 Order 有很好的处理,但不是 re Venue。
由于您接受符合标准的模型并因此接受处理,因此地址是一个参考表。
它是独立的(方角)
实际上,您可以将地址及其上方的所有内容放在第一页上;将模型的这一部分制作为第二页,并且仅在此页面上具有地址。
正确建模:一方有地址历史。他们必须至少有一个当前的 { IsBilling | 航运 | IsPhysical } 地址,基于正在执行的任何活动。
正确建模:一个订单有一个 IsBilling Address(如果需要 IsShipping,则需要添加单独的 Relation)。
Address 不是 Venue 的子节点(也是独立的,正确的)。我不认为场地位于零对多地址中。(也许那是旧的 Cardinality-reversed 错误,但我不确定,因为 Event 和 Venue 的其他混淆。)
实际上 Address::Order 是可疑的。(Q.3) 您是否希望订单引用任何有效地址或执行订单的一方的特定地址?
返回事件。接受声明的 EventDate。很好,但是评论等适用于一般音乐会,而不是他们在蘑菇上表演的单一音乐会。选择 V1.3。
您的术语 re 事件等与要求等一致,但它不支持所述要求。
因此,让我们开始以在现实世界中使用“事件”的方式使用它,并以这种方式对其进行建模。我们一直称之为“Event”,Party-Band-Item,实际上是一个Performance。而且不是预定的通用,而是在特定地点的单个。
这就是您对 EventDate 的意思,或者 EventDate 解析为 Performance。
如果你不介意,我就不打一千字,给你一张图。▶学科领域示例V1.2◀
U.3)是时候将物品和乐队之间的链接移到物品和派对上了吗?就目前的设计而言,我认为不可能出售与您提出的乐队无关的商品。
1.2版
AR.1)完成FavoriteItem 的练习后,我觉得Item to Review 需要一个多对多的关系,所以要指出。必要的?
在 V1.1 中,一个 Item 有很多个 Review,一个 Review 就是一个 Item。一个人产生了许多评论(每个项目一个)。这是合乎逻辑的。
A Review is about many Items
不合理。
如果有的话,既然 FavouriteItem/FavouriteBand 已解决,Review 也需要同样的解决和区分:我们是否需要将 BandReview 与 ItemReview 区分开来?好的/坏的 ItemReview 表示好/坏的 BandReview 还是离散的?
U.7) 这给我们留下了一个需要解决的新问题。如果评论可以是关于乐队、专辑、歌曲或表演的,我们如何确保参考完整性。我们不需要 AlbumReview 来引用 SongReview 等。对其建模。
R.5) 该模型目前在项目级别提供流派,这意味着专辑和歌曲(可以通过 CHECK 约束禁止商品)。不是乐队。这可能就足够了,因为 (a) 乐队会随着时间而变化,(b) 项目级别的分类更精确,以及 (c) 乐队类型可以很容易地从他们的专辑或歌曲中得出。
R.6)成员可以表明他们将参加未建模的活动。还要澄清兴趣与预订与出勤率。
R.8) 未建模。
M.3) 问题已结束,但动词短语保持不变。
M.7) 相对于关联表的逻辑模型。现在该问题已关闭,请删除逻辑模型的所有关联表;任何剩余的表(两个父级之间)都将包含数据。这意味着,遍历所有从属表并删除任何没有数据的表。因此 V1.3 应该不那么混乱。
M.8) 项目是OrderItem。
M.9) 现在 Party-Person-User 已经解决了。Exclusive Subtype 结构需要一个Discriminator,并且 Constrainst 将用于强制完整性。有很多地方,PartyType 是要走的路。但是对于只有两个,一列IsBand
还是IsPerson
足够的。
M.10) 你已经纠正了基数反转的错误,但是一些动词短语仍然走错了路。
2011 年 1 月 27 日
实际上,我认为如果我们进入逻辑键/属性级别(而不仅仅是实体关系级别),很多这些问题会更清楚。现在是我们这样做的时候了。例如:
Q.3) 订单:地址可疑。该约束并不完全正确,因为这将允许订单具有任何地址,而不是特定于执行订单的一方的地址。
但是由于您是没有引用完整性的 MyNonSQL,您可能不知道它在实际 SQL 中是如何完成的,所以我将提供 FK 定义,它也恰好是 RI 约束。当您没有 SQL 时,期望您理解我的简洁语句是不公平的,这些语句基于 RM,规范化并由 SQL 支持。
- 为了使这两个约束为真,由于每个约束中的 Party 必须相同(只有一个
Order.PartyId
),因此只允许属于 PartyId 的 PartyAddress 的子集。
▶地址限定示例◀
在第二部分继续...