私はイベントのデータベースを設計し、それに関する多くの統計を追跡したいと思います。多くの値を持つレコードを格納するデータベースを設計する最も良い方法は何ですか?
オプション1
Events
のための一つのテーブルを作成し、そこにすべての私の統計列を置きます。男性の数、女性の数、正体不明の性別の数、温度、その日、それは開始時と同様に、任意の戦いは、警察が呼ばれていた、となどが
クエリは非常に簡単になりselect * from events
オプション2
Events
とEventsAttributes
の2つのテーブルを作成します。 Events
テーブルでは、ID、イベントタイトル、開始/終了時刻などの重要な情報を保存します。
EventsAttributes
私はすべてのイベント統計情報を保存し、Events
にeventId
外部キーを付けてリンクします。
クエリは次のようになります。
select e.*, (select ev.value from EventAttributes ev where ev.eventId = e.id and attributeType = 1) as NumberOfMale from Events e
を(attributeType == 1
が男性の数を表すことになり)クエリは、オプション1と前方としてまっすぐではないことだろうが、私はそれを正しい方法を設計し、厄介なクエリで暮らしたいです。
どのような選択肢が正しいのでしょうか(なぜ私はデータベース管理者ではありませんが、興味があります)。
ありがとうございます。
オプション1はこれに対処する典型的な方法のように聞こえます。オプション2はEAV(エンティティ属性値)のように聞こえますが、これは非常にまれにしか実装されない邪悪な反パターンです。エンティティのすべてのプロパティ(この場合はイベント)を保持する方法としてテーブルを考えてみましょう。イベント中に複数回起こる可能性のあるもの(警察、怪我など)のための追加のテーブルを検討することもできます。 –
オプション2では、3番目のテーブルAttributeTypesを忘れてしまいました。このルックアップをアプリにハードコードすると、実際には悪いことになります。 –
@RogerWolfそうです。私はそれに言及するのを忘れていた。 – HDoan