Я создаю внешний интерфейс регистрации трафика, который позволяет отображать информацию о конкретном транспортном средстве на территории, а также искать конкретное транспортное средство, но я не уверен, наилучший способ приступить к проектированию моей базы данных. Что я хочу сделать, так это иметь возможность быстро просматривать все записи о транспортных средствах в зависимости от типа транспортного средства и характеристик/подтипов этого транспортного средства. Я не знаю, как лучше всего сделать ссылку из моей записи об одном автомобиле на несколько подтипов/функций. Вот упрощенный пример:
У меня есть таблица для транспортных средств:
VehicleID, LicensePlate, TypeID, SubTypeIDs
1 , 111111 , 2 , ;2;;3;
Таблица для типов транспортных средств:
TypeID, Type
1 , Car
2 , Semi
И таблица для VehicleSubTypes:
SubTypeID, TypeID, SubType
1 , 1 , Coupe
2 , 2 , Flat Bed
2 , 2 , Sleeper
Поле Vehicles.Subtype представляет собой varchar, в котором я в настоящее время просто удаляю подтипы, которые ссылаются на VehicleSubTypes.SubTypeID... Идея состоит в том, чтобы из внешнего интерфейса выбрать каждый SubTypeID при перечислении доступных вариантов и найти указанная строка подтипа (т. е. «Купе») для отображения пользователю или, что более важно, при поиске полуприцепа со спальным местом и плоской платформой для включения подтипов LIKE '%;2;%' AND '%;3; %', чтобы получить только автомобили, которые включают обе функции. Я только думаю об этом решении прямо сейчас, потому что я был в отпуске в течение года, и мой мозг застопорился на мне :) Я уверен, что это ужасный дизайн БД! Но убей меня, я не могу придумать более правильного способа, и все мои усилия по гуглению продолжают находить примеры подтипов, которые просто не применимы или я упускаю сходство с (т.е. людьми с несколькими наборами контактов информация.. люди, очевидно, должны быть одной таблицей, контактная информация, очевидно, должна быть другой, они связываются по идентификатору человека и т. д. и т. д.)
EDIT/Вывод:
Спасибо Борту за то, что встряхнул мою память и указал мне на таблицу ссылок. Теперь я добавил таблицу Link_VehicleToSubTypes:
linkID, VehicleID, SubTypeID
1 , 1 , 2
2 , 2 , 10 //10 = Cargo (Semi)
3 , 2 , 15 //15 = No Sleeper
Кроме того, я создал следующую хранимую процедуру для возврата идентификаторов транспортных средств для транспортных средств, которые соответствуют всем параметрам (до 10), которые я передал ей, таким образом, я могу позже сопоставить эту информацию с результатами поиска в моей таблице транспортных средств, которая включает информация о конкретном транспортном средстве, такая как Vehicle.Color, и, таким образом, я могу отфильтровать окончательный набор результатов:
ALTER PROCEDURE dbo.ReturnVehicleIDsMatchingSubTypes
(
@SubType1 int = NULL,
@SubType2 int = NULL,
@SubType3 int = NULL,
@SubType4 int = NULL,
@SubType5 int = NULL,
@SubType6 int = NULL,
@SubType7 int = NULL,
@SubType8 int = NULL,
@SubType9 int = NULL,
@SubType10 int = NULL
)
AS
DECLARE @intNumberSubTypesToMatch int SET @intNumberSubTypesToMatch =
(SELECT COUNT(@SubType1)
+ COUNT(@SubType2)
+ COUNT(@SubType3)
+ COUNT(@SubType4)
+ COUNT(@SubType5)
+ COUNT(@SubType6)
+ COUNT(@SubType7)
+ COUNT(@SubType8)
+ COUNT(@SubType9)
+ COUNT(@SubType10))
SELECT VehicleID
FROM Link_VehicleToSubTypes
WHERE
SubTypeID IN (@SubType1, @SubType2, @SubType3, @SubType4, @SubType5, @SubType6, @SubType7, @SubType8, @SubType9, @SubType10)
GROUP BY VehicleID
HAVING (COUNT(*) = @intNumberSubTypesToMatch)
RETURN
Я проверил это, и это работает хорошо. Моя реализация хранимой процедуры может быть немного неуклюжей (мне никогда раньше не приходилось считать ненулевые параметры, это все, что пришло мне в голову), но она работает. Борт — я поставлю +1, когда у меня будет достаточно очков для этого! Ваша помощь очень ценится!
SubTypeIds
:) - person ypercubeᵀᴹ   schedule 17.02.2012