0

私は MySQL にまったく慣れていないため、次のセットアップの適切なレイアウトを作成する方法がよくわかりません。

1 つのリディム (リズム) には、いくつかの曲 (曲) を入れることができます。曲には次の情報/フィールドがあります: 名前、アーティスト、レーベル、プロデューサー、最終変更のタイムスタンプ、年、歌詞、フラグ、タグ、ソース。

リディムには、名前、最終更新日、ジャンル、YouTube、および画像のフィールドがあります。

理解を深めるための図を次に示します: http://img194.imageshack.us/img194/6553/93112345.png

すべての情報を 1 つのテーブルに入れると、重複したデータ (ジャンルや画像など) ができてしまいます。これは、アーティスト/曲を含むすべての行に、その歌が歌われたリディム (リズム) があるためです。

現在、私のテーブルは次のようになっています。

RIDDIMS テーブル:

+---------------+--------------+------+-----+-------------------+-------+
| Field         | Type         | Null | Key | Default           | Extra |
+---------------+--------------+------+-----+-------------------+-------+
| riddim        | varchar(255) | NO   | MUL | NULL              |       |
| genre         | varchar(9)   | NO   |     | NULL              |       |
| youtube       | varchar(11)  | NO   |     | NULL              |       |
| image         | varchar(11)  | NO   |     | NULL              |       |
| last_modified | timestamp    | NO   |     | CURRENT_TIMESTAMP |       |
+---------------+--------------+------+-----+-------------------+-------+

TUNES テーブル:

+---------------+--------------+------+-----+-------------------+-------+
| Field         | Type         | Null | Key | Default           | Extra |
+---------------+--------------+------+-----+-------------------+-------+
| riddim        | varchar(255) | NO   | MUL | NULL              |       |
| artist        | varchar(255) | NO   | MUL | NULL              |       |
| tune          | varchar(255) | NO   |     | NULL              |       |
| label         | varchar(255) | NO   |     | NULL              |       |
| producer      | varchar(255) | NO   |     | NULL              |       |
| year          | varchar(4)   | NO   |     | NULL              |       |
| lyrics        | text         | NO   |     | NULL              |       |
| flag          | varchar(12)  | NO   |     | NULL              |       |
| tag           | varchar(255) | NO   |     | NULL              |       |
| source        | varchar(255) | NO   |     | NULL              |       |
| last_modified | timestamp    | YES  |     | CURRENT_TIMESTAMP |       |
+---------------+--------------+------+-----+-------------------+-------+

しかし、それは良いレイアウトではないと確信しています。テーブル/データベース構造がどのように見えるべきかについて提案はありますか?

4

3 に答える 3

1

'riddems' と 'tunes' を別々のテーブルに持つことは、使用するのに適した構造です。基本的に、データを署名オブジェクトとしてモデル化します。特定のフィールドが実際に 2 つの異なるオブジェクトに属している場合、それは 2 つの異なるテーブルにある必要があります。

too テーブルを一緒に接続するには、親テーブルに属するテーブル (この場合、riddem には多くの曲があるため、曲はriddem に属します) で、parents id フィールドへの参照を置きます。したがって、この場合、tunes テーブルには、曲が属する riddem に設定された 'riddem_id' というフィールドが必要です。

于 2012-09-13T22:18:38.753 に答える
1

tunes テーブルの riddim フィールドは、riddims テーブルの主キーへの外部キーである必要があります。通常、テキスト フィールドが一意であることが確実でない限り、テキスト フィールドを主キーとして使用することはお勧めできません。より安全なオプションは、id、riddim_id などと呼ばれるフィールドを使用することです。これは、AUTO_INCREMENT プロパティが設定された数値です。そうすれば、追加するすべての新しいアイテムに独自の一意のキーが自動的に与えられます。次に、他のテーブルのリンクされたレコードの ID と同じ値を持つように外部キーを設定します。

この構造を使用する場合、データを複製する必要はありません (実際、複製すべきではありません)。曲のリディムに関する情報を検索するには、select クエリで結合を実行します。

于 2012-09-13T22:22:20.967 に答える
0

MySQL は他のリレーショナル データベースとそれほど違いはありません。したがって、Oracle、DB2、PostgreSQL の使用経験があれば、それを設計に使用できます。

あなたの説明では、2 つのテーブル間の可能な親子関係について言及していませんでした。tunes テーブルは riddim テーブルの親ですか?

true の場合は、曲テーブルのプライマリ riddim フィールドを指す外部キーとして、riddim テーブルの riddim フィールドを使用する必要があります。1 つの tunes レコードを参照する複数の riddim レコードを持つことができます。

画像と youtube に 11 文字が含まれている理由は明らかではありません。youtune フィールドに実際の URL が含まれている場合は、さらに文字数が必要です。長い文字列を避けるために、列挙子を使用して YouTube と画像フィールドをエンコードしますか?

通常の検索がどのように実行されるか自問してみてください。検索する最も重要なフィールドは何ですか?

年フィールドに VARCHAR 型を使用する理由がわかりません。SMALLINT は、検索とストレージの両方で十分であり、はるかに効率的です。原則として、検索操作には整数型の方がはるかに効率的です。

于 2012-09-13T22:45:16.590 に答える