У меня есть таблица Car в моей базе данных, одна из колонок - buyDate. Я хочу иметь возможность пометить каждую машину несколькими политиками (ограничено 10 политиками). У каждой политики есть время жизни (ttl, продолжительность, например, «5 лет», «10 месяцев» и т. Д.), То есть сколько времени может быть применено с момента покупки автомобиля.
Мне нужно выполнить следующие действия:
- при вставке автомобиля будет установлено несколько политик (хотя бы одна из них установлена)
- иногда автомобиль будет обновляться для добавления / удаления политики
- поиск должен быть выполнен с учетом даты / политики, например: «выбрать все автомобили, которые не охвачены какой-либо политикой на сегодняшний день»
Мой текущий дизайн (политики pol0..pol9):
CREATE TABLE Car (
id int NOT NULL IDENTITY(1,1),
purchaseDate datetime NOT NULL,
//more stuff...
pol0 smallint default NULL,
pol1 smallint default NULL,
pol2 smallint default NULL,
pol3 smallint default NULL,
pol4 smallint default NULL,
pol5 smallint default NULL,
pol6 smallint default NULL,
pol7 smallint default NULL,
pol8 smallint default NULL,
pol9 smallint default NULL,
PRIMARY KEY (id)
)
CREATE TABLE Policy (
id smallint NOT NULL,
name varchar(50) collate Latin1_General_BIN NOT NULL,
ttl varchar(100) collate Latin1_General_BIN NOT NULL,
PRIMARY KEY (id)
)
Проблема, с которой я сталкиваюсь, заключается в том, что sql для выполнения вышеуказанного запроса является кошмаром для написания. Поскольку я не знаю, в каком столбце каждая политика может быть , поэтому я должен проверить все столбцы для каждой политики и т. Д. И т. Д. Поэтому мне интересно, стоит ли менять это. Мои вопросы:
Вместо «int IDENTITY» было выбрано smallint в качестве идентификатора политики, чтобы сэкономить место, так как количество записей об автомобилях будет составлять миллионы. Это просто добавляет сложности при создании Политики, поскольку мы должны обрабатывать идентификатор и т. Д. Стоило ли это делать?
Я думаю, что, может быть, есть гораздо лучший дизайн? Очевидно, что мы могли бы перенести отношение «политика / машина» на свой собственный стол CarPolicy, преимущества были бы:
- нет ограничений на 10 полисов на машину
- добавление / удаление и т.д. намного проще
- когда применяется только политика по умолчанию (когда не применяется ни одна другая, которая называется политикой по умолчанию), мы могли бы сигнализировать, что, не имея какой-либо записи в CarPolicy, теперь это просто делается путем вставки идентификатора политики по умолчанию в один из столбцы.
Минусы в том, что нам нужно изменить классы DB, ORM и т. Д. Что бы вы порекомендовали?
Может быть, есть еще один умный способ реализовать это, которого мы не знаем без использования таблицы CarPolicy?