固定サイズの配列データベースフィールド
-
04-07-2019 - |
質問
データベースフィールドに複数の日付値を保存する必要があります。これらの値は、「ユーザー」に関連付けられます。各ユーザーがこれらのいくつかの日付値の独自の一意のセットを持つように。
ここでは1対多の関係を使用できますが、各ユーザーには正確に4つの日付値が関連付けられているため、1対多のテーブルは多すぎる(多くの方法で速度など)と感じますが、それらに対してクエリを実行するには、これらの4つの値が異なるフィールドにある必要があります。 MyDate1 MyDate2 ...など。しかし、それを取り出すSQLコマンドは毎回4つの値をチェックする必要があります。
つまり、1対多の関係がおそらく最良の解決策でしょうが、より良い/よりきれい/より速い/他の方法がありますか?正しく設計していますか?
プラットフォームはMS SQL 2005ですが、どのプラットフォームでも解決できます。主に適切なdb設計テクニックを探しています。
編集: 4つのフィールドは、同じものの4つのインスタンスを表します。
解決
4つの個別のフィールドとして行う場合、参加する必要はありません。クエリ構文をあまりにもひどくしないようにするには、次のように記述できます。
SELECT * FROM MyTable WHERE 'DateLiteral' IN (MyDate1, MyDate2, MyDate3, MyDate4);
コメントで述べたように、IN演算子は日付フィールドに関しては非常に具体的です(最後の(ミリ秒)まで)。サブクエリではいつでも日時関数を使用できますが、BETWEENは使用できません:
SELECT * FROM MyTable WHERE date_trunc('hour', 'DateLiteral')
IN (date_trunc('hour', MyDate1), date_trunc('hour', MyDate2), date_trunc('hour', MyDate3), date_trunc('hour', MyDate4));
他のヒント
Firebird などの一部のデータベースには、説明したとおりの配列データ型があります。次のように宣言されています:
alter table t1 add MyDate[4] date;
価値のあるものとして、正規化された設計では、日付を行として従属テーブルに保存します。
単一の列に複数の値を保存することは、正規化された設計ではありません。正規化とは、各列に値が1つだけあることを明示的に意味します。
この方法で、従属テーブルに挿入される行が4行以下であることを確認できます。
CREATE TABLE ThisManyDates (n INT PRIMARY KEY);
INSERT INTO ThisManyDates VALUES (1), (2), (3), (4);
CREATE TABLE UserDates (
User_ID INT REFERENCES Users,
n INT REFERENCES ThisManyDates,
Date_Value DATE NOT NULL,
PRIMARY KEY (User_ID, n)
);
ただし、この設計では日付値を必須にすることはできません。
ユーザーIDとともに4つのフィールドを使用するのはどうですか(確かな場合、それを超えることはありません)。
4つの日付フィールドを作成し、フィールドに日付を保存します。日付フィールドはユーザーテーブルの一部である場合もあれば、1対1の関係でユーザーテーブルに結合された他のテーブルにある場合もあります。あなたの電話です。