#sql #sql-server #foreign-key-relationship
#sql #sql-сервер #отношение внешнего ключа
Вопрос:
Влияет ли связь внешнего ключа с таблицей большего размера на производительность?
CREATE TABLE CHARTOFACCOUNT --Contains all accounts
(
AccountNo VARCHAR(23) PRIMARY KEY,
--,
)
CREATE TABLE DEPOSITACCOUNT --Contains all deposit accounts(row less than CHARTOFACCOUNT)
(
AccountNo VARCHAR(23) PRIMARY KEY,
--,
)
CREATE TABLE DEPOSITACCOUNTSTATUS --Contains all Deposit account status 1 to 1 relation
(
AccountNo VARCHAR(23) PRIMARY KEY,
--,
)
DEPOSITACCOUNT
имеет отношение к внешнему ключу с CHARTOFACCOUNT
. Теперь, когда пришло время для DEPOSITACCOUNTSTATUS
, я мог бы связать внешний ключ с DEPOSITACCOUNT
или CHARTOFACCOUNT
, и оба будут действительными. Но поскольку CHARTOFACCOUNT
содержит больше строк, чем DEPOSITACCOUNT
, существует ли какая-либо проблема с производительностью?
Комментарии:
1. Какую СУБД вы используете? (Вопросы производительности почти всегда зависят от конкретного продукта.)
2. в настоящее время для MS SQL Server 2012 и более поздних версий, но я бы предпочел знать, есть ли у других какие-либо проблемы, отличающиеся
3. Первичные ключи для целых чисел работают лучше, чем для переменных.
4. @AbdulRehmanSayed согласен. Но это не было моей заботой.
5. Я не думаю, что установка правильных внешних ключей когда-либо будет стоить производительности. Предположим, вы их не устанавливаете, как вы убедитесь, что ваша ссылочная целостность остается неизменной? Для этого вам придется самостоятельно запускать запросы, и это всегда будет медленнее, чем то, что делает внешний ключ
Ответ №1:
Это звучит как случай преждевременной оптимизации.
Выбирайте внешние ключи на основе системы, которую вы пытаетесь смоделировать, а не только потому, что вы думаете, что может возникнуть проблема с производительностью.
Вы говорите:
Я мог бы установить связь внешнего ключа с DEPOSITACCOUNT или CHARTOFACCOUNT, и оба будут действительными
Это заставляет меня думать, что у вас могут быть проблемы с вашим дизайном. Что хранит CHARTOFACCOUNT
таблица, которая отличается от DEPOSITACCOUNT
таблицы?
Почему депозитные счета обрабатываются иначе, чем другие типы учетных записей? Почему бы не сохранить их в Account
таблице с типом, являющимся атрибутом?
И почему статус депозитного счета хранится отдельно от самого аккаунта? Если между таблицами существует взаимно однозначная связь, вы можете переместить эту информацию в Account
таблицу.
Комментарии:
1. look
CHARTOFACCOUNT
содержит все учетные записи и общую информацию о них, где asDEPOSITACCOUNT
содержит только депозитные учетные записи и соответствующую информацию о депозите. Проблемы с дизайном нет. Проблема дизайна в том, что я мог бы объединитьDEPOSITACCOUNTSTATUS
таблицу сDEPOSITACCOUNT
, поскольку они содержат одинаковое количество строк от 1 до 1. Но в этой ситуации к какой таблице было бы лучше присоединитьсяDEPOSITACCOUNTSTATUS
???2. Если вы не хотите объединять статус учетной записи в таблицу депозитов, то, по логике вещей, у нее должен быть внешний ключ к
DEPOITACCOUNT
таблице. В конце концов, это статус депозитного счета.3. Да, в настоящее время это тоже было так. Но так как
CHARTOFACCOUNT
содержит все депозитные счета, то, если я сделаю связь с ним вместоDEPOSITACCOUNT
целостности данных, это не будет нарушено. Но есть ли здесь какой-то подвох?4. Извините, я не совсем понимаю, что вы подразумеваете под «целостность данных не будет нарушена» — почему установка внешнего ключа в
DEPOSITACCOUNT
таблицу приведет к нарушению целостности?5. Я должен вернуть вас к первой строке моего ответа: это звучит как случай преждевременной оптимизации. Если у вас нет собственного доказательства проблемы с производительностью, поместите внешний ключ туда, где это имеет наибольший смысл . Ранее я работал с таблицами SQL Server, содержащими более 250 миллионов строк, и мы не думали о производительности, а не о дизайне, и у нас никогда не было проблем со скоростью вставок.
Ответ №2:
В принципе, у вас есть три таблицы с одинаковыми первичными ключами. Предполагая, что вы создаете для таблиц кластеризованный индекс, тогда доступ между таблицами будет довольно быстрым.
Вы должны настроить свои отношения так, чтобы они имели смысл. Исходя из схемы именования, я бы предположил, что это DepositAccountStatus
связано с DepositAccount
. Следовательно, я бы поместил отношение внешнего ключа к этой таблице.
Это не проблема с производительностью. Это просто правильное моделирование данных.
Другой вопрос заключается в том, почему таблица состояния имеет тот же первичный ключ, что и DepositAccount
. Почему бы просто не поместить статус непосредственно в эту таблицу?
Комментарии:
1. Вы попали точно в точку. Использование другой
DEPOSITACCOUNTSTATUS
таблицы действительно является плохим дизайном.