さまざまなアイテム (メモ、記事、写真、ファイル) を 1 つのテーブルに保存します (カテゴリ、タグ、評価、統計など、すべてのアイテム タイプに共通する多くのメタデータがあります)。
私の最初のデザインは次のようなものでした: テーブルItemsに加えて、各項目タイプ ( NoteItems、ArticleItems、PictureItemsなど)の別の「詳細」テーブル。1 つのアイテムを取得するには、テーブルを 1 対 1 で結合する必要があります (SELECT * FROM Items INNER JOIN PictureItems ON Items.Id = PictureItems.Id WHERE Items.Id = N)。
私はこの「本通りの」設計がうまく機能すると確信しています (それを数回行っています) が、この設計がやり過ぎなのかどうか疑問に思うようになりました。単一のテーブル ( Items )を持つ方がはるかに簡単です。
画像またはファイルの種類のアイテムが約 5% あるとします。
そしてここで、質問: (ほぼ) 単一のテーブル デザインを使用する場合、画像フィールド用の詳細テーブルを作成した方がよいでしょうか (もちろん、画像とファイル アイテム用)。
シナリオ 1: 1 つのテーブルのみ:アイテム(メモ、記事、写真、ファイルを保存するため...)
シナリオ 2: 2 つのテーブル: Items (メモ、記事、画像ファイルを格納するため)、ImageItems (アイテム タイプの画像、ファイルの画像フィールドのみを格納するため)。一対一の関係
(シナリオ 3 は、シナリオ 2 のマイナーなバリエーションです。3 つのテーブル (Items、PictureItems、FileItems) を使用します)
シナリオ 1 の利点は次のとおりです。
- より単純な選択クエリ (結合なし)
- トランザクションのない更新(INSERT/UPDATE では 1 つのテーブルのみが更新されます)
- トランザクションレス更新によるパフォーマンス、スケーラビリティ?
シナリオ 2 の利点は次のとおりです。
- よりクリーンなデザイン
- より少ないデータ消費量(シナリオ 1 では、画像またはファイル以外のタイプのアイテムの約 95% がイメージ フィールドに NULL 値を持ち、ポインターに約 16 バイトが無駄になります)
1 (トランザクションのない更新) または 2 (データ消費量が少ない) のどちらのシナリオを選択しますか? ご意見ありがとうございます。