Поле базы данных массива фиксированного размера
-
04-07-2019 - |
Вопрос
Мне нужно хранить несколько значений даты в поле базы данных. Эти значения будут привязаны к «пользователю» так что у каждого пользователя будет свой уникальный набор этих нескольких значений даты.
Я мог бы использовать здесь отношение «один ко многим», но у каждого пользователя было бы привязано ровно 4 значения даты, поэтому я чувствую, что таблица «один ко многим» будет излишней (во многих отношениях, например, по скорости), но если я нужно запросить их, мне нужно, чтобы эти 4 значения были в разных полях, например MyDate1 MyDate2 ... и т. Д., Но тогда команде SQL для ее извлечения придется каждый раз проверять 4 значения.
Таким образом, отношения «один ко многим», вероятно, были бы лучшим решением, но есть ли лучший / чище / быстрее / какой-либо другой способ? Я проектирую это правильно?
Платформа MS SQL 2005, но подойдет решение на любой платформе, я в основном ищу подходящие методы проектирования БД.
EDIT: 4 поля представляют 4 экземпляра одного и того же.
Решение
Если вы сделаете это в виде четырех отдельных полей, вам не нужно присоединяться. Чтобы сохранить синтаксис запроса не слишком ужасным, вы можете написать:
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));
Другие советы
Некоторые базы данных, такие как Firebird , имеют тип данных массива, который точно соответствует описанному вами. Объявлено что-то вроде этого:
alter table t1 add MyDate[4] date;
Для чего стоит нормализованный дизайн - хранить даты в виде строк в зависимой таблице.
Хранение нескольких значений в одном столбце не является нормализованным дизайном; Нормализация явно означает, что каждый столбец имеет ровно одно значение.
Таким образом, вы можете убедиться, что в зависимую таблицу вставлено не более четырех строк:
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)
);
Однако этот дизайн не позволяет делать значения даты обязательными.
Как насчет того, чтобы иметь 4 поля вместе с идентификатором пользователя (если вы уверены, что он не будет превышать это значение)?
Создайте четыре поля даты и сохраните даты в полях. Поля даты могут быть частью вашей пользовательской таблицы, или они могут быть в какой-то другой таблице, присоединенной к пользовательской таблице в отношении один к одному. Это твой звонок.