1

SQLite データベースに 3 つのテーブルがあります。

曲:

_id | name | length | artist_id | album_id

アーティスト:

_id | name

アルバム:

_id | name

複数の値を持つことができるテーブルが必要artist_idです。Songsそれを達成するための最良の方法は何ですか?

1-文字列フィールドとして作成すると、値は次のようになります。1, 2, 5各数値はテーブルのIDを表しArtistsます。

2- テーブル内の各レコードに対してテーブルを作成しますSongs。各テーブルには複数の値が含まれます (非常に悪い解決策のようです?!)。

3- 次のフィールドを含むテーブルを作成します。

_id | artist_id

whereはテーブルを_id表し_idSongs主キーではありません。Whileartist_idはアーティストの ID です。


質問の後半:

3 つのテーブルを正しく作成した場合、次のテーブルを持つクエリを作成するにはどうすればよいですか。

_id | name | length | artist1_id | artist1_name | artist2_id | artist2_name | ...

ここでは、曲のすべてのアーティストを 1 つのテーブルにまとめました (ただし、ほとんどの曲にはアーティストが 1 人しかいませんが、アーティストがいない曲もあります)。

4

4 に答える 4

2

1人のアーティストが多くの 曲を書くことができ、 1つの曲を多くのアーティストが書くことができる場合があります

これは、多対多の関連付けになります。通常、このタイプのリレーションは、ケースのリレーションを格納する追加のテーブルで表されます。

Artist_Song:

artist_id | song_id

次に、 Artistテーブルからその列を削除する必要があります。次に、データベースは3NFで正規化されます。

このアプローチは経験則ではありません。データベースがデータを解決するために必要な追加のワークロードのために変更される場合があります。

2番目の質問については、DBスキーマに依存します。上記の構造を使用する場合は、必要なすべての情報を取得するためにテーブルを結合する必要がありますが、それらは行で表示されるため、ピボットしてアーティストを列で表す必要があります。

ところで。曲は別のアルバムに表示される可能性があることを忘れないでください。

于 2012-07-05T11:33:14.860 に答える
0

1つの質問:曲のartist_id。典型的なマスター/詳細テーブル

2つの質問:列を動的に作成することは困難であり、sqliteはそのようなことを行うのにそれほど協力的ではありませんが、最も簡単な方法は、以下のようなデータセットを返すことです。

song_id | Artist_id

上記のデータセットには重複するエントリが含まれている必要があります。これは、アーティストが複数の曲を持っているため、artist_nameで簡単に並べ替えることで、非常にきれいに並べ替えることができるためです。次に、必要なすべての曲について、2番目の選択を行います

(1,2,3,4、...);のsong_idが含まれる曲から[fields]を選択します。

これにより、曲に必要なすべての情報を含む新しいデータセットが返されます。

于 2012-07-05T11:00:30.420 に答える
0

アーティスト、アルバム、曲の ID が同じなのはなぜですか?

artist_id と album_id を外部キーにすれば解決します。

于 2012-07-05T11:07:36.967 に答える
0

あなたの質問の最初の部分については、従うべき方法としてあなたの 3 番目の提案をお勧めします。次のクエリを実行して曲を取得するだけで、(必要に応じて) テーブルの作成をスキップできます。

select Songs.* 
from Songs, Artists
where Songs.id = Artists.id and Artists.id = $the_id_of_the_artist_whose_songs_you_want_to_get$

あなたの質問の2番目の部分については、あなたが提案したことができるかどうかわかりませんが、ここに似ていますが正確ではない解決策があります. 次のクエリを使用してビューを作成できます。

create view your_view as
select songs.id, songs.name, songs.length, artists.id, artists.name
from songs
left outer join artists
on songs.id = artists.id
where songs.id = &the_id_of_the_song_you_want&

ただし、私の意見では、次のようにクエリを使用して必要な結果を取得できます。

select songs.id, songs.name, songs.length, artists.id, artists.name
from songs
left outer join artists
on songs.id = artists.id
where songs.id = &the_id_of_the_song_you_want&

上記は、曲のアーティストごとに複数の行を返しますが、複数の列は返しません。

于 2012-07-05T11:08:01.290 に答える