У нас есть базовая таблица, которая определяет детали и содержит такую информацию, как номер детали, описание, цена, вес и т. Д. У нас также есть приблизительно 400 таблиц, которые ссылаются на базовую таблицу и предоставляют дополнительную информацию о деталях на основе их типа / категории.
Мы начали с использования ограничений внешнего ключа, чтобы деталь не могла быть удалена из базовой таблицы, если на нее ссылаются в одной из 400 таблиц, специфичных для детали, но мы быстро достигли максимально 253 рекомендуемых внешних ключей для SQL Server 2005.
Существуют ли альтернативы внешним ключам в этой ситуации, которые обеспечат целостность данных? Мы не видели проблем с производительностью при доступе к данным, но обновление существующей детали в базовой таблице завершится неудачно, поскольку план запроса слишком сложен.
источник
Ответы:
Если есть какой-либо способ группировки деталей, вы можете использовать промежуточные таблицы в качестве обходного пути. Это не сработает.
Но что-то в этом роде может.
Я хотел бы внимательно посмотреть на ваш DDL, прежде чем я порекомендую это сделать. И если вы сделаете это, не начинайте бросать идентификационные номера повсюду. Вы должны иметь возможность присоединять «Table 400» непосредственно к «Parts», не включая «GreenBlueIndigoViolet parts».
источник
Если вы действительно не можете объединить таблицы, почему бы не создать
TRIGGER
базовую таблицу для предотвращения удаления?Начните здесь: http://msdn.microsoft.com/en-us/library/ms189799(v=sql.90).aspx
источник
Замените 400+ таблиц одной. Нужно только 3 поля (+1 автонумерация или любой первичный ключ, если хотите, не обязательно его иметь, вы можете сформировать его из других полей)
Значение атрибута идентификатора элемента
Итак, если в других ваших таблицах каждое поле представляет атрибут, в этой таблице все ваши атрибуты находятся в одном поле. Вы бы что-то вроде этого
Значение атрибута ItemID
Материал носка Шерсть
Цвет Носка Красный
Вес носка 20 фунтов
Чужая Планета Альфа Центавра
Чужой Цвет Фиолетовый
Инопланетянин Нет
ItemID, вероятно, должен быть числом / буквенно-цифровым символом ofc. Затем вы просто создаете кросс-таблицу с атрибутами как заголовки столбцов, когда это необходимо для создания таблиц, которые вам нравятся. Это также позволяет лучше запрашивать такие вещи, как «Покажите мне все предметы из Альфа Центавра», которые могут вернуть вам Чужого, а также фрагмент Метеорита, содержащий чуму, которая уничтожает человечество (оно приходит .....)
Оптимизация может быть сложной в зависимости от количества записей, но это гораздо лучший способ спроектировать это. Я сделал то же самое для базы данных, которая содержала кучу рецептов (10 000+), которые имели мало совпадений. Хорошо сработало в этом случае. На самом деле проблем со скоростью не было. Ваш может быть сложнее в зависимости от того, с кем вы имеете дело.
источник
Entity
,Entity_Attribute
,Entity_Attribute_Value
). Если вы хотите добавить полуадекватную обработку для различных типов данных и референтных ограничений, вам понадобится больше.