Во многих проектах реляционных баз данных есть поля, на которые ссылаются другие таблицы.
Например, рассмотрим пользовательскую таблицу с уникальным именем пользователя и вторую таблицу, в которой хранятся адресные данные.
Один из возможных вариантов, который я бы сказал, это общий подход, потому что я наблюдал в большинстве программ, это использовать идентификаторы автоинкремента:
Table users
===========
userId int primary auto_increment
userName varchar unique
Table adressdata
==========
userId int references users.userId
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userId,adress_type))
Вот как я это делал и как я видел это в большинстве случаев.
Другой способ будет:
Table users
===========
userName varchar primary
Table adressdata
==========
userName varchar references users.userName
adress_type varchar // for example country
address_value varchar // for example US
(you probably also want to put a unique key on (userName,adress_type))
Здесь мы храним полное имя пользователя также в таблице адресных данных.
Для меня это имеет следующие преимущества:
Вы можете выбрать имя пользователя прямо из таблицы без необходимости присоединять его к другой таблице. В этом примере это с точки зрения приложения, вероятно, не так актуально, но это только пример.
Возможно, будет проще масштабировать базу данных в среде репликации мастер-мастер, потому что нет конфликтов auto_increment.
Но также и недостатки:
- Требования к пространству для индекса и данных (но более уместным будет индекс) в поле во второй таблице выше.
- Изменение имени пользователя должно распространиться на все таблицы, что требует больше ресурсов, чем просто изменение его в одной таблице, и оставить идентификаторы без изменений.
На мой взгляд, гораздо проще работать с текстовыми полями и не использовать идентификаторы приращения, а компромиссы минимальны и в большинстве приложений не актуальны.
Конечно, некоторые объекты идентифицируются с возрастающим числом по своей природе (например, сообщения форума должны получать увеличивающийся идентификатор, потому что, вероятно, нет другого уникального поля, такого как title или около того).
Но прежде чем я начну разрабатывать макеты своей базы данных совершенно другим способом, я хотел бы знать, есть ли вещи, о которых я не думал.
Есть ли лучшие практики?
Есть ли плюсы / минусы, о которых я не думал, и эффект от которых может возникнуть в более поздний момент времени?
Как вы лично проектируете базы данных относительно вышеперечисленных пунктов и почему?