Я делаю внешний интерфейс регистрации трафика, который позволяет отображать информацию о конкретном транспортном средстве, а также искать конкретное транспортное средство, но я не уверен, что лучший способ продолжить разработку моей базы данных , То, что я хочу сделать, это иметь возможность быстро получить все записи транспортного средства, основанные на типе транспортного средства и особенностях / подтипах этого транспортного средства. Я не знаю, как лучше всего ссылаться из моей записи об одном автомобиле на несколько подтипов / функций. Вот упрощенный пример:
У меня есть таблица для транспортных средств:
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 при перечислении доступных опций и найдите строку SubType, на которую ссылаются (т. е. «Coupe»), для отображения пользователю, или, что более важно, при поиске Semi со спальным местом и плоской кроватью, чтобы включить SubTypes LIKE '%; 2;%' AND '% ; 3;% 'пункт, чтобы получить только транспортные средства, которые включают обе функции. Я только думаю об этом решении, хотя прямо сейчас, потому что я был в отпуске в течение года, и мой мозг останавливается на мне :) Я уверен, что это ужасный дизайн БД! Но что касается меня, я не могу придумать более правильного способа, и все мои усилия по поиску в Google продолжают приводить примеры подтипов, которые просто не применяются, или я упускаю сходство с (т. Е. Люди с несколькими наборами контактов информация .. люди, очевидно, должны быть одной таблицей, контактная информация, очевидно, должна быть другой, они связываются по personID и т. д. и т. д.)
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, когда у меня будет достаточно очков для этого! Ваша помощь очень ценится!