Я видел таблицы в базе данных SAP
и базе данных TFS
(как конфигурации, так и коллекции), которые не имеют определенных первичных ключей. Почему это?Почему некоторые таблицы в популярных базах данных не имеют первичных ключей?
ответ
Никто не пытался ответить на этот вопрос до сих пор, так что здесь идет ...
Некоторые таблицы не нуждаются в PRIMARY KEY, потому что они никогда не будут обновляться, и может иметь только крошечный набор данные в них (например, таблицы поиска). Если эти таблицы вообще не имеют индексов, то это, по сути, кучи, что не всегда плохо.
Почему каждый стол должен иметь PRIMARY KEY? Если таблица имеет UNIQUE CLUSTERED INDEX, то это делает почти все, что делает PRIMARY KEY, с добавленным бонусом, чтобы вы могли сохранять значения NULL. В зависимости от реализации (например, SQL Server допускает только одно «уникальное» значение NULL, другие RDBM разрешают несколько), это может быть намного лучше для вашего приложения.
Например, предположим, что вам нужна таблица с двумя столбцами, номером учетной записи и именем учетной записи. Предположим, что вы сделали свой номер учетной записи PRIMARY KEY, потому что хотите убедиться, что он уникален. Теперь вы хотите разрешить номера учетных записей NULL, потому что они не всегда предоставляются в том месте, где вы создаете учетную запись; у вас есть какой-то странный процесс из двух частей, в котором вы создаете запись только с именем, а затем заполните номер учетной записи. Если вы придерживаетесь дизайна PRIMARY KEY, вам нужно будет сделать что-то вроде добавления столбца IDENTITY, сделать это PRIMARY KEY, а затем добавить UNIQUE CONSTRAINT для предотвращения идентичных номеров нескольких учетных записей.
Теперь у вас остается суррогатный ключ, который вряд ли будет полезен для любых запросов, поэтому вы, вероятно, в конечном итоге получите индекс производительности, даже если вам не нужна уникальность.
Если у вас не было PRIMARY KEY, но вместо этого UNIQUE CLUSTERED INDEX вы могли бы сделать это, не изменяя таблицу, и только один клиент когда-либо позволял иметь номер счета NULL в одно и то же время (если это SQL Server).
Я разработал базу данных для клиента пару лет назад, в которой было более 200 таблиц, а не один ПЕРВЫЙ КЛЮЧ. Хотя это было больше о том, что я «делаю точку», не стоит предполагать, что то же самое верно для других разработчиков баз данных.
В TFS число таблиц не имеет первичного ключа или внешних ключей, что очень специфично для ограничений производительности. Кроме того, эти базы данных не должны обновляться вручную, TFS обрабатывает все изменения этих таблиц, хотя и имеет свои собственные API. Это одна из причин, по которым Microsoft не поддерживает прямой запрос к этим таблицам.
Еще одна причина в случае TFS заключается в том, что ее облачная копия Visual Studio Team Services не хранит все свои данные в SQL Azure, а в хранилище хранилищ табличных хранилищ или в DocumentDB.
Вопрос, похоже, больше связан с структурой базы данных SQL-сервера, а не с самим TFS. – Chamberlain