Поле базы данных массива фиксированного размера - PullRequest
2 голосов
/ 24 октября 2008

Мне нужно хранить несколько значений даты в поле базы данных. Эти значения будут привязаны к «Пользователю», так что у каждого пользователя будет свой уникальный набор этих нескольких значений даты.

Я мог бы использовать здесь отношение «один ко многим», но у каждого пользователя было бы привязано ровно 4 значения даты, поэтому я чувствую, что таблица «один ко многим» будет излишней (во многих отношениях, например, по скорости), но если я нужно запросить их, мне нужно, чтобы эти 4 значения были в разных полях, например MyDate1 MyDate2 ... и т. Д., Но тогда команде SQL для ее извлечения придется каждый раз проверять 4 значения.

Таким образом, отношение «один ко многим», вероятно, было бы лучшим решением, но есть ли лучший / чище / быстрее / какой-либо другой способ? Я проектирую это правильно?

Платформа MS SQL 2005, но подойдет решение на любой платформе, я в основном ищу подходящие методы проектирования БД.

РЕДАКТИРОВАТЬ: 4 поля представляют 4 экземпляра одного и того же.

Ответы [ 5 ]

2 голосов
/ 24 октября 2008

Некоторые базы данных, такие как Firebird , имеют тип данных массива, который делает именно то, что вы описали. Объявлено примерно так:

alter table t1 add MyDate[4] date;
2 голосов
/ 24 октября 2008

Если вы сделаете это как четыре отдельных поля, тогда вам не нужно присоединяться. Чтобы сохранить синтаксис запроса не слишком ужасным, вы можете написать:

SELECT * FROM MyTable WHERE 'DateLiteral' IN (MyDate1, MyDate2, MyDate3, MyDate4);

Как уже упоминалось в комментариях, оператор IN довольно специфичен в отношении полей даты (вплоть до последней (милли) секунды). Вы всегда можете использовать функции даты и времени в подзапросе, но МЕЖДУ невозможно использовать:

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));
1 голос
/ 24 октября 2008

Для чего стоит, нормализованный дизайн будет хранить даты как строки в зависимой таблице.

Хранение нескольких значений в одном столбце не является нормализованным проектом; Нормализация явно означает, что каждый столбец имеет ровно одно значение.

Вы можете убедиться, что в зависимую таблицу вставлено не более четырех строк:

 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)
 );

Однако этот дизайн не позволяет делать значения даты обязательными.

0 голосов
/ 24 октября 2008

Создайте четыре поля даты и сохраните даты в полях. Поля даты могут быть частью вашей пользовательской таблицы, или они могут быть в какой-то другой таблице, присоединенной к пользовательской таблице в отношении один к одному. Это твой звонок.

0 голосов
/ 24 октября 2008

Как насчет того, чтобы иметь 4 поля вместе с идентификатором пользователя (если вы уверены, что он не превысит этого)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...