方法
我会涵盖具体细节,但只会完全涵盖一两个学科领域,而不是全部。您可以将其应用于所有学科领域。
我还没有回答核心学科领域,因为我们仍在处理实体识别。解决了这个问题后,Reviews
等将更容易;交易实体取决于识别实体。
方向
D.1) 我知道我说过需要看整个模型。有一个例外情况。历史、时间或审核数据(例如编辑和存储的版本)。在这个早期阶段,它们可以被搁置;在逻辑模型完成之前实现。这是承认它们是某个父级的简单依赖项(a),必须先将父级与所有其他表建模相关(b),以排除不必要的复杂性(c),从而使我们集中精力处理相关领域。
- 特别是,您可以忽略动词短语中的时态(否则每个版本表的位置都需要
Has/Had
)。现在保持现在时态,因为重点是建模,而不是归档。
未解决的问题
U.1) 可选父级
这是完全不允许的。不仅是由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,只能作为 Asset 在 Band 的上下文中存在。很好。这意味着数据库中没有其他商品,只有乐队商品。是正确的吗?
我可以看到 "Evening performance with the Blues Brothers" 是一个可以订购、开票和支付的事件。还可以进行评论等操作。
我不知道 Song
如何适应其中。乐队是在销售专辑、歌曲还是两者兼而有之?
难道没有其他乐队商品:音乐会/活动纪念品;海报;刻有标志的小酒杯吗?
与您提及的命名约定和数据库的其余部分一致,Catalog
(内容)应该被命名为 Item
(行)。您已经(自然地?)在 OrderSaleItem
中使用了它,而不是 OrderSaleCatalog
。
U.4) Genre
U.5) 喜爱的
Item::Favorite
的基数被颠倒了。当你纠正它时,Favorite
主题区域将需要进一步建模。
实体之间的循环关系或双重路径是未解决模型的信号。通常一个是正确的,而另一个是多余的。(有例外情况,但不在这里; 当发生这种情况时,动词短语会区分它们。)
Band::Favorite
或 Item::Favorite
二者中只能正确一个。
Item::Favorite
似乎是正确的,因为 Band
已经在 Item
中被识别出来了
同样地,为乐队和商品设置一个 Favorite
实体并不牢固。单个 Favorite
实体中的每个标识符都是一个 Party
。当规范化时,它将会破裂,最好在此阶段要求明确标识符。 它可以是一个带有某种形式差异(FavoriteType
)的实体,以确定其处理方式;或者一个用于乐队和另一个用于商品的 Favorite
,在这种情况下不需要差异化,消除了歧义。
U.6) 业务规则
这可能是你唯一薄弱的领域。总体反应,你已经分别完成了任务(所有建模与编写BRs)。它们不符合模型。在进行下一个周期时,将业务规则作为指令,并同时调节它们,就像实体、关系和动词短语一样。
问题
Q.1) 用户/朋友
你已经完美地掌握了它的本质。以及关系的基数。(对此进行全面处理。)这对于已接受的Friend
是正确的。
Q.2) “人是零到多个用户”的基础是什么?
小问题
M.1) 只使用单数。
M.2) Party Has zero-to-many Addresses
。我认为他们必须有一个地址才能进行交易(但可能不是所有的Users
)。
M.3) 订单可能有零到多个付款
。"需要"意味着第一个Payment
必须与Order
同时插入。
- 同样,对于任何强制性子项(一对多而不是零到多),第一个子项必须与父项同时插入。这通过企业数据库中的事务完成,因为实现了立即约束检查(而非延迟),而小镇上的人们则为了傻事情争吵,例如延迟约束检查更好,并且花费他们一半的生命来弄清楚如何不被陷入他们创建的无限循环中。MySQL根本没有这些,所以对于此实现没有什么可担心的。
M.4)OrderSaleItem
应该是OrderItem
或者Order
应该是OrderSale
。这取决于您是否预见将来会有OrderPurchase
。
主题区域示例
对于不熟悉关系数据库建模标准的读者,可能会发现IDEF1X符号很有用。
如上所述,我不提供完成的数据模型,仅提供指导。这只是一个选定主题领域的进展。它并不完全正确或完整。
您的动词短语很好。我提供了一些备选方案供您考虑,它们并不是“正确”或“更好”。您需要选择一个进展或自己的进展。目标是在每种情况下最简明准确地使用动词短语。
没有建议认为“Person”是正确的,“User”是错误的,这要等待您的答案。但是我必须在模型中使用一些东西;由于您已将它们建模为单独的内容,对立面可能很有趣进行评估。
因此,请继续推进模型,然后再发布(只需编辑问题,保留标题段落并替换其余部分)。
V1.1和响应
那肯定是一个进步。
我已经以伪法律格式重新编号了项目,包括章节标题,以便我们可以始终保持编号并继续添加。实际上,这确实缓解了SO编辑问题。
U.3)是否需要对目录部分进行整体改造,还是只需要存在与乐队之间的识别关系?
尝试修改以销售完整专辑或歌曲。无论哪种方式,它们都只能以电子格式下载。这就是为什么我将专辑列为由歌曲组成的原因
而不是两个独立的实体。
U.5) ...但我不清楚如何做。我错过了什么?
具有差异化的一个实体示例是任何一个超类型/子类型集群。收藏夹是超类型,BandFavourite和ItemFavourite是子类型;允许每个引用到Band xor Item。
你已经建模了ItemFavourite。现在的问题是,ItemFavourite的事实是否意味着Band是喜爱的;或者BandFavourite是一个离散的事实?在示例中,我建模了后者,没有使用Favourite::ItemFavourite/BandFavourite结构。
Q.1) 是的,我想要Accepted、Rejected和Blocked。我不确定你所说的会如何改变逻辑模型?
V1.0无需更改(我已经说明它非常完整),但您可能需要一个额外的实体。
您需要在Friend中添加三个位或布尔指示器。这将服务于以下状态:
请求
(但未接受)
请求和接受
.
但是,被阻止的不是朋友(或者以前可能是朋友,但自从被阻止以来就不是了)。因此,要么实体名称必须更改以反映这一点(对两个关系没有更改),要么Blocked必须是一个单独的实体。第二个关系的两个分离含义会导致复杂性,因此我会选择后者。
通过前者,我们有了其他状态:
已阻止
.
- 然后动词短语需要更改(为了清晰起见,我将包括RoleName),其中一个具有替代含义。
- (在属性级别模型中,这将更加清晰,这就是为什么我们用图片建模而不是文字;因此我已经包括它。)
问题2)一个人不必成为用户。他们只能作为BandMember存在。这就是你在问什么吗?
M.3) 我需要更多地了解约束检查,以确保我理解得正确。
- 现在不用担心这个问题。我只是给你一个简单的理由(不兼容的SQL数据库似乎使事情变得简单,但实际上它们使事情更加复杂)。MySQL没有这些能力,所以你可以排除考虑平台,并且只需有意义地对模型进行基数建模。
M.4) 这取决于你是否预见到未来会有OrderPurchase。你能详细说明一下吗?
在模型的背景下,你提供了结构来制作销售订单(物品)。因此是Item、Order和OrderItem。
但如果你也提供了跟踪采购订单的结构(购买物品以及办公用品、租金等),那么你需要区分销售订单和采购订单。因此:
Item
OrderSale和OrderSaleItem
OrderPurchase和OrderPurchaseItem
版本1.1
U.2) 事件进展
EventDate看起来不错。我会将关系定义为Event Was Performed On EventDate
。
而ItemGenre是完美的,但Event::Venue需要改进。这是您一贯犯的错误,因此需要解释。
您正确地对Venue进行了建模,它是独立的,并且存在于Event的上下文之外。但是,Event May Be [Held] At zero-to-many [Independent] Venues
是不可能的。
活动在许多场馆举行,场馆也举办许多活动。如果只有这些,由于这是逻辑级别,您可以绘制多对多关系,然后完成。在物理级别上,该关系通过实现联合表来解决,其PK是两个父PK,没有数据。(Enemy是一个很好的例子。)
但是,如果有数据(例如,您需要跟踪日期或参与者人数等),则它不是联合表,而是另一个实体。在Event和Venue之间发生的事情。
EventDate是一个很好的候选项。我们已经有了那个日期。只需添加Venue并搅拌即可。我会将在Event和Venue之间发生的事情称为Performance。
同样,EventAddress已经进展,但尚未完成。
活动有地址还是场馆有地址?(对其进行建模,无需用语言解释)
如果是场馆:您需要场馆的所有历史地址(例如Party),还是只需要当前地址(例如Order)?
M.5) SubGenre. 请解释为什么SubGenre是(a) 独立的,以及(b) 关系是非识别的。
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)为添加的要求提供坚实的平台。这并不意味着您必须建模整个真实世界,但您建模的部分必须反映现实,而不是被压缩以满足要求。
其次,有关事件、乐队-事件、表演等之间的区别缺乏清晰度。现在,事件是Party-Band-Item-Event。这很好,但它不适用于新样式的事件要求。
第三,在Party和Order方面,您对地址有很好的掌握,但在Venue方面却没有。
由于您接受标准兼容模型和处理方式,因此地址是一个参考表。
它是独立的(方形角落)。
实际上,您可以将地址和位于其上方的所有内容放在第一页上;使这部分成为模型第二页,并仅在此页面上使用地址。
正确建模:Party有Addresses的历史记录。根据正在执行的任何活动,他们必须至少有一个当前的{IsBilling | IsShipping | IsPhysical}地址。
正确建模:订单有一个IsBilling地址(如果需要IsShipping,则需要添加单独的关系)。
地址不是Venue的子级(也是独立的,正确的)。我认为会场不会位于零到多个地址中。(也许这是旧的基数反转错误,但由于其他关于事件和场馆的混淆,我不确定。)
实际上,Address :: Order是可疑的。(Q.3)您是否希望订单引用任何有效地址,还是针对执行订单的Party的特定地址?
回到事件。接受声明的EventDate。那很好,但评论等适用于通用音乐会,而不是他们在蘑菇上表演的单个音乐会。选择V1.3。
您关于事件等术语与要求等的一致性,但不支持所述要求。
因此,让我们开始按照现实世界中使用的方式使用“Event”,并将其建模。我们一直称为“Event”的Party-Band-Item实际上是Performance。而不是计划的通用性能,而是在特定场地进行的单个性能。
这是您使用EventDate的意思,或者EventDate解决了Performance。
如果你不介意的话,我会避免打一千字,给你一张图片。
主题领域示例 V1.2
注意,每个事件中的多个乐队已经解决了。
动词短语直接来自天堂。一个地址托管多个场馆,每个场馆提供多个事件,每个事件有多个表演,每个表演都是一个聚会乐队项目。
U.3) 是不是该将项目和乐队之间的链接移到项目和聚会上呢?根据目前的设计,我看不到销售与乐队无关的商品的可能性,正如你所提出的。
首先,我们需要使用关系术语,不是因为我是个学究,而是因为真正的专家说这真的有助于过渡到关系世界。
其次,我们不能通过“移动关系”来实现这一点。
你必须对非乐队商品进行建模:你要如何销售它;如何跟踪它;如何收款。无论你是否想要评论和回应等。我不明白聚会与此有何关系,而且现在我们正在销售乐队商品,而不是聚会商品。请考虑引用完整性问题。
版本 1.2
AR.1) 经过FavoriteItem的练习,我觉得Item to Review需要一个多对多的关系,因此需要指定。这是必要的吗?
在V1.1中,一个Item有很多评论,而一个评论只涉及一个Item。一个人可以产生很多评论(每个Item一个评论)。这是合理的。
“一个评论涉及多个Item”是不合理的。
如果有什么问题,现在FavouriteItem/FavouriteBand已经解决,Review也需要相应的解决和区分:我们需要区分BandReview和ItemReview吗?好/坏的ItemReview是否表示好/坏的BandReview,还是它们是离散的?
一个评论(目前)不能同时涉及Band和Item。这意味着两个外键,其中一个将为Null,而Null FK是不允许的。Item和Band已经有了区别,这种区别是成熟的。
ItemReviews可以进行总结等,但那是另外一回事。
U.7) 这留下了一个新问题需要解决。如果评论可以涉及乐队或专辑或歌曲或表演,我们如何确保引用完整性。我们不需要AlbumReview引用SongReview等。对其进行建模。
R.5) 该模型目前在项目层面提供了音乐类型 (Genre),意味着专辑和歌曲可以用此标记。(可以通过 CHECK 约束禁止商品使用此标签) 但没有对乐队进行分类。考虑到(a) 乐队会随时间变化,(b) 在项目层面进行此类分类更加精确,以及(c) 可以从他们的专辑或歌曲中轻松推断出乐队类型,这可能足够了。
如果需要单独对乐队进行分类,你需要添加此功能。
那么活动类型 (Event Genre) 呢? 如果需要,我认为每个活动只能有一个类型。
请记住,像场馆和音乐类型这样的表格是主要数据库中的重要搜索条件。它们也是分析向量。
数据仓库团队需要将其添加为事实表的维度;在正确建模的数据库中,它们已经作为事实表的维度存在。 展示所有安排了"Folk Music" 活动并吸引超过10,000人的场馆非常易懂。
讨论点。 不是说上述内容不正确。 我在数据库和iTunes中发现,精确性很重要。为什么要让Genre::几个东西,而不是Genre::具体的东西? 如果你只有Genre::Song,并且歌曲仅有一个类型,那么专辑和乐队就是精确的合并结果。现在我们拥有的方式取决于数据录入人员的音乐知识,并且 Genre::Thing 是多种多样的,所以它非常松散。Genre :: Song 则更加精确。
R.6) 没有对"members can show that they will be attending the Event"进行建模。此外,需要澄清兴趣、预订和出席之间的区别。
R.8) 没有进行建模。
M.3) 该问题已关闭,但动词短语保持不变。
M.7) 逻辑模型与关联表。现在该问题已关闭,应删除逻辑模型中的任何关联表;任何剩余的表(两个父表之间)都将包含数据。这意味着需要遍历所有从属表并删除没有数据的表。因此,V1.3 应更简洁。
M.8) 项目 是 OrderItem。
M.9) 现在 Party-Person-User 已经解决。独占子类型结构需要一个鉴别器,并且约束将用于强制执行完整性。当存在多个时,PartyType 是最好的选择。但是对于只有两个的情况,列 IsBand
或 IsPerson
就足够了。
M.10) 您已经纠正了基数反转错误,但某些动词短语仍然朝着错误的方向进行。
27 Jan 11
实际上,如果我们进入逻辑键/属性级别(而不仅仅是实体关系级别),很多这些问题会更清晰。现在是时候这样做了。例如:
Q.3) Order:Address 是可疑的。约束条件不完全正确,因为这将允许订单拥有任何地址,而不是特定于执行订单的 Party 的地址。
但是由于你是MySQL,没有引用完整性,可能不知道在真正的SQL中如何完成,因此我将提供FK定义,这也是RI约束。希望你能理解我的简洁陈述,这些基于RM,规范化并由SQL支持,当你没有SQL时,这有点不公平。
- 为了使两个约束都成立,由于Party必须在每个约束中相同(只有一个
Order.PartyId
),因此只允许属于PartyId的PartyAddress子集。
地址资格示例
续第二部分...