2

50 年代と 60 年代のチャート レコード/アルバムを表示する Web アプリを構築しています。

現在、私は次のようなものを持っています(無関係なものがたくさん削除されています):

group_performance_role

「group」という名前のテーブルは、かつて「person」テーブル、「person_group」結合テーブル、「group」テーブルとしてモデル化されていました。これに関する問題は、外部キー 'group_performance_role.group_id' で "person" テーブルと "group" テーブルの両方を参照できないことです。

私はその構造を維持することに決めましたが、すべての「人」は自動的に 1 の「グループ」になる必要があります。ただし、これは命名のあいまいさを生み出し、テーブルが複数のものを保持することを意味します - 時には単一のアーティスト (「ジョン・レノン」) と時にはグループ (「ザ・ビートルズ」) です。

複数の「タイプ」のものを保持するテーブルなどの悪い慣行を回避しながら、アーティスト (1 人またはグループ) をパフォーマンスにリンクする方法を見つける必要があります。

ウェブを検索しましたが、関連する回答はほとんど見つかりませんでした。ヘルプ/アドバイス/提案は大歓迎です!!

編集:「ロール」テーブルは、人/グループがパフォーマンスで実行できるロールのルックアップ テーブルです。例: 「アーティスト」、「作曲家」、「オーケストラの指揮者」など

4

4 に答える 4

3

継承を使用して、さまざまな種類またはアーティストをモデル化することを検討してください。

(ところで、あなたのGroup_Memberテーブルはグループ内のグループを許可しています。これはあなたが望んでいたものではないと思います。)

ここに画像の説明を入力

ただし、これは、アーティストのタイプに応じて役割が異なる可能性があることを無視しています。たとえば、グループ全体が「指揮者」になることはほとんど意味がありません。これらの種類の制約を強制することが重要な場合は、「強引な」アプローチを取り、個人固有の役割とグループ固有の役割を単純に分離できます。

ここに画像の説明を入力

(ところで、グループ固有のロールと個人固有のロールの名前が重複しないようにする場合は、両方のロール テーブルを継承階層に配置する必要があります。ここには示されていません。)

もちろん、これはまだ特定の役割のカーディナリティを尊重していません。たとえば、「指揮者」になれるのは(1公演につき)1人だけです。それを解決するには、モデルをさらに拡張する必要があります。

ここに画像の説明を入力

そして、おそらく同様のことをグループに対して行う必要があります。

これら 3 種類のロールのいずれかを通じて、特定のパフォーマンス (たとえば ) に関与するすべての人を取得するには、27次のようなクエリが必要です。

SELECT *
FROM Person
WHERE person_id IN (

    SELECT person_id
    FROM Group_Person JOIN Group_Performance_Role
        ON Group_Person.group_id = Group_Performance_Role.group_id
    WHERE performance_id = 27

    UNION

    SELECT person_id
    FROM Person_Performance_MultiRole
    WHERE performance_id = 27

    UNION

    SELECT person_id
    FROM Person_Performance_SingleRole
    WHERE performance_id = 27

)

これは、複数の役割でパフォーマンスに関与している場合でも、人を最大 1 回しかリストしないことに注意してください (たとえば、同じ人が「指揮者」であり、同じパフォーマンスで役割を持つグループのメンバーになることができます)。

ロール名も取得するには、次のことができます。

SELECT Person.*, group_role_name
FROM Person
    JOIN Group_Person
        ON Person.person_id = Group_Person.person_id
    JOIN Group_Performance_Role
        ON Group_Person.group_id = Group_Performance_Role.group_id
WHERE performance_id = 27

UNION ALL

SELECT Person.*, person_multirole_name
FROM Person
    JOIN Person_Performance_MultiRole
        ON Person.person_id = Person_Performance_MultiRole.person_id
WHERE performance_id = 27

UNION ALL

SELECT Person.*, person_singlerole_name
FROM Person
    JOIN Person_Performance_SingleRole
        ON Person.person_id = Person_Performance_SingleRole.person_id
WHERE performance_id = 27

ご覧のとおり、私たちはモデルをますます正確にすると同時に、ますます複雑にしています。そして、曲やアルバム、進化するグループ メンバー (など...) についてはまだ触れていません。「精度」と単純さの間の適切なバランスがどこにあるかを判断する責任はあなたにあると思います。

于 2012-09-20T10:09:10.053 に答える
2

あなたの最終的な目標は、パフォーマンスのデータベースを保存することですよね?

つまり、パフォーマンスは、あるカテゴリーのパフォーマーによって演奏され、あるカテゴリーの作曲家によってアレンジされ、あるカテゴリーのプロデューサーによってプロデュースされます。これらすべての可能性を表現するには、抽象的なエンティティが必要だと思います。私が今召喚できる最高の名詞はクレジットです。「あなたの名前のクレジットを拡張する」からです。(モリセット 1995 )

したがって、私が想像する方法では、Creditのいくつかのカテゴリがあると思います。最初のレベルでは、これらはPersonPersonのセットであるGroup、「Parlephone」や「Island Records」などのようなOrganizationであると想像します.

保存したい属性に応じて、これらのクレジットカテゴリのサブカテゴリが存在する場合があります。ただし、各Performanceには多数のPerformanceCredit関係があり、各PerformanceCredit関係にはPerformanceCreditTypeへの外部キーがあると思います。


これはすべて、Performanceから論理的に分離されていると私が考えるSongとの関係を無視します。Songには独自のSongCredit関係があり、SongCreditType "Writer" は頭に浮かぶ明らかなものです。各ソングは多数のパフォーマンスに関連しています

これはすべて、パフォーマンスのコレクションである録音(DVD、78、LP、MP3 など) にうまく拡張されますが、独自の独立したクレジットを持つことができます。


クレジットからこの情報を取得すると想定しているため、これは理にかなっていると思います。

このレベルの柔軟性が必要だと思います。「ポール・マッカートニー」に関するすべてを報告したい場合を考えてみてください。ソロとグループの両方で、作家、作曲家、ミュージシャン、プロデューサーとしての彼の直接の功績は膨大です. 次に、彼が他のミュージシャンによって作詞・作曲された曲の演奏について考えてみましょう。

于 2012-09-20T09:15:53.460 に答える
1

あなたのやり方はおそらく理にかなっていると思います。グループとグループ メンバー/人物の両方を別々にモデル化していると仮定します。これは、グループとグループ メンバーに対して実行する操作/アクションが異なるためです (グループ メンバーのモデル化をまったく気にしない場合)。

その場合、ジョン・レノンの場合、彼に対して個人操作グループ操作の両方を実行できるようにしたいので、グループとグループメンバーとして彼をDBに2回表示させることは理にかなっていると思います、2 つのエンティティは、ジョン レノンがドメインで果たす異なる役割を表しているためです。

于 2012-09-20T08:45:34.283 に答える
0
  • レコードにはたくさんの曲があります。
  • 各曲には1人のアーティストがいます-名前があります。
  • アーティストには1つ以上のバージョンがあります
  • ArtistVersionには、パフォーマーである1人以上のメンバーがいます

例えば

Records : 
   1 Give Peace a Chance
   2 Penny Lane

Artists
   3 The Beatles
   4 Plastic Ono Band

Songs 
   5 4 Give Peace a Chance
   6 3 Penny Lane
   7 3 Strawberry Fields Forever

RecordSongs
   1 - 5
   2 - 6
   2 - 7

ArtistVersions
   8 - The Beatles v1 
   9 - Plastic Ono Band v1

Performers
   10 - Ringo Starr
   11 - John Lennon
   12 - Yoko Ono

ArtistVersionMembers
   8 - 10 
   8 - 11
   9 - 11
   9 - 12
于 2012-09-20T09:14:40.637 に答える