私はmysqlの初心者です。ベストプラクティスを学びたいと思っています。私は以下のように同様の構造をセットアップしました。これはデータベースの正規化ですか?
(メイン、すべての一意のエントリを含むテーブル)TABLE = 'main_content'
+------------+---------------+------------------------------+-----------+
| content_id | (deleted) | title | member_id |
+------------+---------------+------------------------------+-----------+
| 6 | | This is a very spe?cal t|_st | 1 |
+------------+---------------+------------------------------+-----------+
は(各難易度の合計を提供し、ID加入 - >実際の名前)TABLE = '難しさ' を
+---------------+-------------------+------------------+
| difficulty_id | difficulty_name | difficulty_total |
+---------------+-------------------+------------------+
| 1 | Absolute Beginner | 1 |
| 2 | Beginner | 1 |
| 3 | Intermediate | 0 |
| 4 | Advanced | 0 |
| 5 | Expert | 0 |
+---------------+-------------------+------------------+
(このテーブルは、複数の値は、エントリごとに挿入することができることを確実にする。例えば、 この特定のエントリが2 dがあることを示し提出に関連したifficulties) TABLE =「lookup_difficulty」
+------------+---------------+
| content_id | difficulty_id |
+------------+---------------+
| 6 | 1 |
| 6 | 2 |
+------------+---------------+
私が読める問合せにこのすべてに参加しています:
SELECT group_concat(difficulty.difficulty_name) as difficulty, member.member_name
FROM main_content
INNER JOIN difficulty ON difficulty.difficulty_id
IN (SELECT difficulty_id FROM main_content, lookup_difficulty WHERE lookup_difficulty.content_id = main_content.content_id)
INNER JOIN member ON member.member_id = main_content.member_id
上記正常に動作しますが、私はこの場合は疑問に思って良い習慣です。私は実質的にWikipedia's Database Normalization exampleのレイアウトに従った。
EXPLAIN
を使用して上記のクエリを実行すると、次のように表示されます。私は2つの独立したサブクエリを使用しています。サブクエリを使用して同じ効果を達成する方法はありませんが、もう一度私はnoobですので、おそらくもっと良い方法があります。
なぜ 'main_contant'困難にFKルックアップテーブルを持っていますか?ビルドしようとしていることを説明することができますので、デザインを評価することができますか? – Jacob
lookup_difficultyテーブルを破棄して、代わりにmain_content(composite_id、difficult_id)の複合PKを使用するように見えます。 –
申し訳ありませんが、私はその列を削除するつもりです。私はdifficult_idを使用していません..私は投稿を編集します。私はすべてのテーブルを本質的にmain_content.content_idに関連付けようとしています。 – Justin