質問

データベースフィールドに複数の日付値を保存する必要があります。これらの値は、「ユーザー」に関連付けられます。各ユーザーがこれらのいくつかの日付値の独自の一意のセットを持つように。

ここでは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の関係でユーザーテーブルに結合された他のテーブルにある場合もあります。あなたの電話です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top