БД: использовать тождественный столбец или нет?
При разработке таблицы мой коллега говорит, что мне следует избегать столбца идентификаторов, поскольку он специфичен для SQL Server и MS Access, но я не согласен с его представлениями, поскольку это упрощает мое кодирование.
Должен ли я использовать идентификационный столбец или нет? Если нет, то какой лучший способ создать столбцы идентификаторов из кода приложения?
4 ответа
Вы не можете полностью отделить приложение от поставщика базы данных. Если вы это сделаете, вы не сможете воспользоваться всеми функциями, которые предоставляет вам ваша база данных.
Я бы сказал, используйте столбец идентификации. Если вы перейдете к Oracle (например), вы можете использовать Sequence. Вряд ли большие перемены.
Я не знаю, какую технологию вы используете, но одна вещь, которая могла бы помочь, - это использование инструмента, такого как Hibernate или iBATIS (я думаю, что они оба доступны для Java и.NET), который немного отделяет вас от реализации базы данных. подробности. Тогда, если вы смените поставщика базы данных, вам не нужно будет менять код приложения, просто настройку. (По крайней мере в теории!)
Имеет ли значение, что это специфично для платформы Microsoft? Ваше приложение должно быть переносимым, т.е. планируете ли вы его перенести в mysql/postgres/ что угодно?
Используйте столбец идентичности!
Это отделяет вашу "Логику приложения" от "Бизнес-логики".
Допустим, вы используете "электронную почту" в качестве первичного ключа (что имеет смысл в терминах "бизнес-логики"). Вы столкнетесь с проблемами, когда этого письма больше не будет, и ваш пользователь захочет изменить ваше письмо.
Не используйте столбец идентификаторов, если вы полностью не знаете о его подводных камнях и не имеете веской причины использовать SEQUENCE или генератор эмулированной последовательности.
Последовательности гораздо более гибкие и не имеют недостатков / ограничений, которые имеют столбцы Identity.
Из http://www.jumpingbean.co.za/blogs/mark/identity_autoincrement_fields_and_database_sequences:
Боль с автоинкрементом
Копирование данных при сохранении значения идентичности
Автоинкрементные клавиши могут стать проблемой, когда вам нужно скопировать целые табуляции и сохранить значение первичного ключа. Попытка вставить непосредственно в столбец идентификаторов приведет к возникновению ошибки. Обычно поставщик предоставляет некоторые операторы, которые позволяют вам временно отбросить ограничение, чтобы вы могли вставить существующие значения. В MSSQL вы можете выполнить команду
"УСТАНОВИТЬ ПРОДУКТЫ_INSERT ON".
Другие поставщики потребуют, чтобы вы сняли ограничение и затем снова включили его.
Больше боли - как получить значение вновь вставленных строк?
Кроме того, сервер обычно предоставляет различные способы получения значения столбца идентификаторов для вновь вставленной строки. Для MySQL это функция LAST_INSERT_ID(), а для MSSQL это @@identity, например select @@identity.
MS SQL Server 2011 будет поддерживать ПОСЛЕДОВАТЕЛЬНОСТЬ.
Если вы используете сервер RDBMS, который не поддерживает SEQUENCE (например, MSSQL pre-2011 или MySQL), есть две альтернативы:
- Переключитесь на PostgreSQL. Это самый простой вариант, правда. Вы получаете корпоративный RDBMS-сервер с полностью открытым исходным кодом. И вы можете получить коммерческую поддержку, если хотите.
- Используйте библиотеку доступа к данным, которая поддерживает эмуляцию SEQUENCE. Реализации JPA 2.0, например EclipseLink, Hibernate, делают это очень тривиальным для вас (стратегия TABLE). Это не является взаимоисключающим с вышеуказанным. Использование JPA 2.0 с PostgreSQL сделает вашу жизнь намного проще, чем, скажем, сырой JDBC с MySQL.
Насколько мне известно, каждая немного серьезная СУБД имеет своего рода уникальную схему нумерации для каждой таблицы.
- Access и SQL Server имеют идентичные столбцы
- MySQL имеет столбцы с автоинкрементом
- PostgreSQL имеет последовательности
- sqlite имеет неявный столбец ROWID
- У Oracle есть какая-то последовательность, хотя я совсем не знаком с ней
Я в основном использую его, теоретически это не всегда требование, но если вы хотите сохранить ссылочную целостность, int хранить меньше и его легче сравнивать, чем varchar, особенно если ваши внешние ключи будут более сложными, чем один столбец.