Поле базы данных массива фиксированного размера

StackOverflow https://stackoverflow.com/questions/231695

  •  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 поля вместе с идентификатором пользователя (если вы уверены, что он не будет превышать это значение)?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top