То, что вы описываете, звучит как структура наследования.Насколько я понимаю, я создал примерный набор данных.Можете ли вы подтвердить, что это ваше намерение?
Если это так, то это должно работать нормально, и я не понимаю, почему вы не устанавливаете CategoryType.Id в качестве первичного ключа?Если это не ваш ПК и не упоминается как FK в другом месте, то я не вижу в этом смысла.Лично я не думаю, что вы получаете достаточную экономию пропускной способности, и, вероятно, стоит просто запросить данные по CategoryId и Name.На самом деле, ни один PK не является тем, как представлены структуры наследования ( Как вы можете представлять наследование в базе данных? ).
Если вы должны сохранить его так, как вы его настроили,Я лично предлагаю установить Id в качестве PK и просто установить уникальное ограничение для CategoryId / Name.
Это всего лишь два моих цента.
Category
----
Id|Name
1 |Food
2 |Drink
CategoryType
----
Id|CategoryId|Name
1 |2 |Water
2 |2 |Orange Juice
ОБНОВЛЕННЫЙ ОТВЕТ (для непосредственного решения проблем производительности)
Во-первых, я бы посоветовал не беспокоиться об этом тоже.много, если это не проблема.Это общая проблема, которую многие из нас создают, усложняя то, что ей не нужно.Это подпадает под принцип ПОЦЕЛУЯ в моей книге
Однако, если вы устали от попыток выяснить это заранее, как вы объяснили, то вот мои дополнительные мысли:
- Создайте PK как Id, но сделайте его НЕКЛАСТЕРНЫМ
- Создайте кластеризованный индекс для CategoryId и рассмотрите возможность использования ключевого слова INCLUDE в вышеупомянутом некластеризованном индексе.
- Делайте это только в том случае, если вы чаще будете использовать CategoryId для запросов, чем CategoryType.Id
- Хотя при создании ваших ключей следует учитывать (даже взято из статьи
INCLUDE
)
Index maintenance may increase the time that it takes to perform modifications
, inserts, updates, or deletes, to the underlying table or indexed view.
В конечном счете, я думаю, что все, что вы делаете, будет в порядке, однако ПК не нужно кластеризовать, поэтому я определенно перенесу ПК в поле Id,Это ваш выбор, если вы хотите сделать кластер на CategoryId или CategoryId / Name, или если вы хотите попробовать использовать INCLUDE, как я предлагал.Это действительно будет зависеть от того, как используются таблицы, поэтому здесь может помочь сравнение планов выполнения.
Надеюсь, это поможет:)