Нужно ли генерировать уникальный идентификатор для каждой строки в таблице базы данных, которая в противном случае не имеет уникальных ключей? - PullRequest
0 голосов
/ 13 января 2012

Я проектирую базу данных MySQL для стартапа, работающего с медицинскими картами пациентов. У меня есть несколько таблиц, которые не могут иметь уникальных ключей: медицинские условия, аллергии, семейный анамнез и т. Д. Например, таблица medications может иметь поля patient_id, med_name, usage_dates, dosage, reason и т. д. Единственный гарантированный уникальный ключ - это все поля вместе.

Веб-приложение может легко получить эти данные для данного пациента, выбрав значение patient_id, но если невозможно сохранить указатели на строки в базе данных с несколькими пользователями, оно кажется мне неуклюжей системой для редактирования или удаления строки в этой таблице. СУБД должна будет выбрать значение для каждого поля, чтобы найти правильную строку. Из того, что (мало) я знаю о базах данных, я полагаю, что это может быть неэффективно в большой базе данных.

Было бы более эффективно создать новое поле с идентификационным номером, который будет функционировать в качестве первичного ключа в каждой из этих таблиц, или СУБД намного умнее меня, и это совершенно не нужно?

Ответы [ 4 ]

2 голосов
/ 13 января 2012

Вы всегда можете добавить простой числовой первичный ключ (например, mysql auto_increment), чтобы в результате вы получили уникальный идентификатор для каждой строки.Составные первичные ключи представляют собой серьезную проблему, если вам приходится использовать таблицу в отношении внешнего ключа, что вынуждает перечислять каждое из полей компонента первичного ключа во всех спецификациях соединений / FK.Для сравнения, добавление простого первичного ключа int сводит вас к переносу этого ОДНОГО поля для отношений FK / join.

Я бы предложил что-то вроде:

patients (id, name, ....)
meds (id, brand, name, ...)
patient_meds (patient_id, med_id, dosage, ...)
1 голос
/ 13 января 2012

Я думаю, что поле идентификатора - это почти всегда хорошая идея. Это гарантирует один столбец, который вы можете использовать для уникальной идентификации одной строки в вашей базе данных. Я также думаю, что это хорошая идея, потому что она может ускорить ваши запросы, потому что первичный ключ таблицы проиндексирован, поэтому, если вы выбираете на основе столбца уникального идентификатора, MySQL не нужно искать по всем строкам, чтобы найти ты ищешь. Он точно знает, куда идти, и ваши запросы будут выполняться намного быстрее.

1 голос
/ 13 января 2012

Да, это «лучшая практика».В дополнение к обновлениям, он делает удаления и некоторые объединения гораздо быстрее.

Многие сторонние инструменты зависят от уникального первичного ключа.

1 голос
/ 13 января 2012

Да, это будет называться "синтетическим ключом", и я, конечно, добавлю его, вероятно, просто как поле AUTO_INCREMENT. Это сделает обновления намного проще (и быстрее), если вы это сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...