6

非常勤の漫画家でもある酪農家は、数頭の牛の群れを飼っています。彼は各牛を特定の群れに割り当てました。各群れで、農家は彼のお気に入りの牛を1頭飼っています。多くの場合、その牛は漫画で取り上げられています。各群れのいくつかの不満、主に漫画に登場すべきだと感じている人々は、彼らが軽蔑的に神聖な牛と呼んでいる好きな牛の農民の選択に同意しません。その結果、各群れは現在、群れのリーダーを選出しました。

これは私がテーブルがどのように見えるべきだと思うかです。それがもっとうまくいくことができるかどうか私に知らせてもらえますか?これまでのところ、私はお気に入りのテーブルを使用して多対多の作業を行っています。中間体はこれが最善の解決策であり、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これは正しいですか?

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

新しい画像を追加@8:57am2010年7月20日誰かがこのERDを批評することができます Erd2http://img37.imageshack.us/img37/5794/capture3fc.png

新しい画像を追加@12:47pm 7/20/2010異議がない限り、これはマークの説明 マーク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

農民は1人しかいないので、今後の議論から除外してください。これらはあなたの基本的な実体です。

各エンティティにはどのような属性がありますか?

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?

これらの質問は、エンティティ間の関係が必須かオプションか、および関係が1対多か多対多かを概説するのに役立ちます。

于 2010-07-19T18:39:18.590 に答える
4

ディスカッションアイテムなので、コミュニティWikiにしました。

リレーショナルモデルがうまく機能しないことの1つは、群れレベルで保持されているSacredCowとHerdLeaderが、実際にはその群れのメンバーである牛を指していることを強制することです。

あなたの群れがスターとクロスだとしましょう。「スター」の群れの詳細では、リゲルがSacredCowとして、キャスターがHerdLeaderとして指定される場合がありますが、「カウ」の表には、キャスターが「クロス」の群れのメンバーとして表示される場合があります。実際には、新しい群れを作成するとき、牛のいない群れ(したがって、HerdLeader / SacredCowがない)または群れのない牛のいずれかがある場合、鶏と卵のシナリオに直面します。

別のモデルには、特定の牛が群れのHerdLeaderおよび/またはSacredCowであるかどうかを示す「Cow」テーブルがあります。[物理的な実装では、すべての群れにSacredCowである牛が1頭、HerdLeaderである牛が1頭しかないことを強制する独自の制約があります。]。「Herd」テーブルにはSacredCowまたはHerdLeaderはありません。 。このモデルでは、すべての群れにHerdLeaderとSacredCowがあることを強制できません。

どちらもモデルです。どちらにも欠陥があります。論理的なレベルでは、前者の方が正規化されているので、おそらく前者を使用します。物理的には、どの不整合がより厄介で発生する可能性が高いかを検討し、それを最も防ぐモデルを選択します。

于 2010-07-19T23:17:16.647 に答える
1

私はあなたが実際にあなた自身でこれをやろうとしたのが好きです。実際、あなたはもうすぐそこにいるので、悪い仕事をしたことはまったくありません。

これをオブジェクト/エンティティの観点から見てみましょう。

エンティティには次のものが含まれます。

  • 群れ
  • CowHerds(牛をヒアリングに関連付ける必要があります)
  • CowCartoon(牛の1頭がお気に入りです。牛の頭を使ってチェーンを上ることで、この牛の鳴き声をいつでも参照できます)

  • CowID(主キー)
  • CowName(varchar、これがキーになる可能性がありますが、牛の名前は同じである可能性がありますか?)

群れ

  • HerdID(主キー)
  • HerdName(これは主キーになる可能性もあり、最終的にはこれがあなたの決定です)
  • CowID(外部キー、各群れには牛のリーダーがいることを覚えておいてください。これを別のテーブルに分けることもできますが、実際には価値がありません)

CowHerds

  • CowID(牛へのfK)
  • HerdID(fk to listens)

上記のフィールドの組み合わせが主キーとして機能します

カウカートゥーン

  • CartoonID(漫画の主キー)
  • CowID(「お気に入りの」牛、農家が漫画を書く予定の牛を参照)
  • 公開日(公開日)
  • タイトル ....

コメントで述べたように、CowHerdsテーブルを削除して、Cowsテーブルで直接HerdIDを参照することもできます。

于 2010-07-19T17:11:43.017 に答える
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関係に、cowIDだけでなくherdIDがどのように含まれているかに注目してください。これにより、群れの牛だけがその群れのsacredCowまたはherdLeaderになることができます。

この設計により、実装が少し難しくなりますが、不可能ではありません。群れの外部キーは、Oracleのようなデータベースで延期可能にする必要があります。これは、牛の行を挿入する前に群れの行を挿入できる必要があり、群れには少なくとも2頭の牛が必要だからです( sacredCowとherdLeader)。

パート2。

次の課題は、次の制約を実装することです。

only a Sacred Cow may be featured in a Cartoon

これを行う1つの方法は、牛を2つの別々の関係(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

牛が一度に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 に答える