6

一位奶农,也是一名兼职漫画家,有几头奶牛。他将每头奶牛分配到一个特定的牛群中。在每个牛群中,农民都有一头他最喜欢的奶牛——这头奶牛经常出现在卡通片中。每个牛群中都有一些不满的人,主要是那些认为他们应该出现在卡通片中的人,不同意农民选择一头最喜欢的牛,他们轻蔑地将其称为圣牛。结果,现在每个牧群都选出了牧群领袖。

这就是我认为表格应该看起来的样子,你能告诉我它是否可以做得更好吗?到目前为止,我正在使用最喜欢的表作为中间表进行多对多操作,这是最好的解决方案,也不需要 SQL 语句,这只是出于设计目的。

先感谢您

Table Herd           Table Favorite               Table Cartoon   Table Cow
PK herdID          Intermediate Table             PK cartoonID     PK cowID
   herdname                                          cartoonTitle     cowName
   herdleader                                        cartoonType
                                                     cartoonDate

编辑的图像@ 3:01pmEST 这是正确的吗?

牛 http://img838.imageshack.us/img838/1268/capture3h.png

添加了新图片@ 2010 年 7 月 20 日上午 8:57 有人可以批评这个 ERD,请 Erd2 http://img37.imageshack.us/img37/5794/capture3fc.png

2010 年 7 月 20 日下午 12:47 添加了新图片,除非有任何异议,否则这是根据马克的解释 标记 ERD http://img651.imageshack.us/img651/691/capture4b.png的最终草案

4

5 回答 5

5

迈克尔:

问题陈述中的名词是什么,有多少个?

Farmer  - There is one farmer
Cow     - There are many cows
Herd    - There are many herds
Cartoon - There are many cartoons

由于只有一个农民,因此不要将他排除在未来的讨论之外。这些是您的基本实体。

每个实体有什么属性?

Cow     - each cow has a name
        - each cow is a member of a herd
Herd    - each herd has a name
        - each herd has a cow that is the sacred cow
        - each herd has a cow that is the herd leader
Cartoon - each cartoon has a name
        - each cartoon may have a cow that appears in it 
             (not specified definitively)

因此,其中一些属性引用了其他实体,而有些则没有。不引用其他基本实体的属性很简单。其他的需要更多的考虑。

Can a cow be a member of more than one herd?
Must a cow be a member of a herd?
Can a herd have more than one cow that is the sacred cow?
Must each herd have a cow that is the sacred cow?
Can a herd have more than one cow that is the herd leader?
Must each herd have a cow that is the herd leader?

这些问题有助于概述实体之间的关系是强制性的还是可选的,以及这些关系是一对多还是多对多。

于 2010-07-19T18:39:18.590 回答
4

一个讨论项目,所以我把它做成了一个社区维基。

关系模型做得不好的一件事是强制在牧群级别持有的 SacredCow 和 HerdLeader 实际上指向作为该牧群成员的奶牛。

假设您的牛群是星形和十字形。'Star' Herd 的详细信息可能使 Rigel 成为 SacredCow 和 Castor 作为 HerdLeader,但 'Cow' 表可能显示 Castor 是 'Cross' Herd 的成员。在实践中,当创建一个新的牛群时,当你有一个没有牛的牛群(因此没有 HerdLeader/SacredCow)或没有牛群的牛时,你会面临鸡和蛋的情况。

另一种模型将具有“牛”表,指示特定牛是否是其牛群的 HerdLeader 和/或 SacredCow。[在物理实现中,可以使用唯一约束来强制每个 Herd 只有一头牛是 SacredCow 和一头牛是 HerdLeader。] .“Herd”表不会有 SacredCow 或 HerdLeader . 这种模式无法强制要求每个牛群都有一个牧群领袖和一头圣牛。

两者都是模型。两者都有缺陷。在逻辑层面上,我可能会选择前者,因为它更加规范化。在物理上,我会考虑哪种不一致会更麻烦,更容易发生,我会选择最能防止它的模型。

于 2010-07-19T23:17:16.647 回答
1

第1部分。

如果以下情况属实:

each Cow must be in exactly one Herd
a Herd must have a sacredCow and a herdLeader
a sacredCow for a Herd must be a Cow in that Herd
a herdLeader for a Herd must be a different Cow in that Herd

然后你可以用这个部分模型来实现这些规则:

Cow (cowID, herdID) (all mandatory columns)
- primary key (cowID)
- unique (herdID, cowID)
- foreign key (herdID) references Herd (herdID)

Herd (herdID, sacredCow, herdLeader) (all mandatory columns)
- primary key (herdID)
- foreign key (herdID, sacredCow) references Cow (herdID, cowID)
- foreign key (herdID, herdLeader) references Cow (herdID, cowID)
- constraint (sacredCow != herdLeader)

注意 FK 关系如何包括 herdID,而不仅仅是 cowID。这确保只有牛群中的那些牛可以成为该牛群的神圣牛或牧群领袖。

这种设计使事情实现起来有点棘手,但并非不可能。Herd 上的外键必须在 Oracle 这样的数据库中延迟,因为我们需要能够插入 Herd 的行,然后才能插入 Cows 的行,而 Herd 至少需要两个 Cows(神圣的牛和牧群领袖)。

第2部分。

下一个挑战是实施以下约束:

only a Sacred Cow may be featured in a Cartoon

一种方法可能是将 Cows 拆分为两个独立的关系:SacredCows 和 NonSacredCows。

SacredCow (sacredCowID, herdID) (all mandatory columns)
- primary key (sacredCowID)
- unique (herdID, sacredCowID)
- foreign key (herdID) references Herd (herdID)

NonSacredCow (nonSacredCowID, herdID) (all mandatory columns)
- primary key (nonSacredCowID)
- unique (herdID, nonSacredCowID)
- foreign key (herdID) references Herd (herdID)

Herd (herdID, sacredCow, herdLeader)
- primary key (herdID)
- foreign key (herdID, sacredCow) references SacredCow (herdID, sacredCowID)
- foreign key (herdID, herdLeader) references NonSacredCow (herdID, nonSacredCowID)

Cartoon (cartoonID, featuredCow) (all mandatory columns)
- primary key (cartoonID)
- forign key (featuredID) references SacredCow (sacredCowID)

(在此设计中,不再需要约束 (sacredCow != herdLeader),因为它们现在是不同的奶牛。)

于 2010-07-20T05:08:53.507 回答
1

我喜欢你实际上尝试自己做这件事。事实上你就快到了,所以你根本没有做坏事。

让我们从对象/实体的角度来看这个。

这些实体包括以下内容:

  • 奶牛
  • 牛群
  • CowHerds(你必须将一头母牛与一头牛联系起来)
  • CowCartoon(其中一头奶牛是最喜欢的,您可以随时参考这头奶牛听到的消息,通过使用 cowid 上链)

奶牛

  • CowID(主键)
  • CowName(varchar,这可能是关键,但奶牛可能有相同的名称,对吧?)

牛群

  • HerdID(主键)
  • HerdName(这也可以是主键,最终这是你的决定)
  • CowID(外键,记住每个牛群都有一个牛头,你甚至可以在另一个表中分开这个,但这真的不值得)

牛群

  • CowID(fK 到奶牛)
  • HerdID (fk to hears)

上述字段的组合作为主键

牛卡通

  • CartoonID(卡通的主键)
  • CowID(“最喜欢的”奶牛,指农夫要写卡通的奶牛)
  • 发布日期(发布日期)
  • 标题 ....

正如评论中提到的,您还可以摆脱 CowHerds 表,直接在 Cows 表中引用 HerdID。

于 2010-07-19T17:11:43.017 回答
1

假设一头牛一次只能属于一个牛群,并假设不止一头牛(显然来自不同的牛群)可以出现在同一个卡通片中,我的建议是:

表群

Herd ID (PK)
Herd Name

桌牛

Cow ID (PK)
Herd ID (FK)
Cow Name
Is Leader (Boolean)
Is Sacred (Boolean)

表卡通

Cartoon ID (PK)
Cartoon Title
Cartoon Type
Cartoon Date

表外观

Cow ID (PK)
Cartoon ID (PK)
于 2010-07-20T15:00:54.190 回答