В чем смысл связьей в MySQL? Или как получить данные таблице по foregin key?
Зачем вообще нужны связи в mysql? К примеру у нас есть таблица users
_______________________
| id | login | password |
-----------------------
| 1 | bob | pas123 |
-----------------------
И comments
________________________
| id | author_id | text |
------------------------
| 1 | 1 | Hello |
------------------------
И я уже сделал связь между comments.author_id --> users.id И как теперь сделать так, чтобы при получении комментариев за одно выдавало полную информацию и об авторе? Что-то типа:
db.query("SELECT * FROM comments WHERE comments.id == 1", (err, result)...)
[
RowDataPacket {
id: 1,
author_id: 4,
author: {
id: 1,
login: "bob",
password: "eca9a1c9802ab7590d"
},
text: 'Hello',
loaded: 2022 - 05 - 12T22: 59: 43.000Z
}
]
Ответы (1 шт):
Зачем вообще нужны связи в mysql?
Надо вопрос ставить иначе. Сначала спрашивать надо так: а что это такое - связи (внешние ключи)?
Связь в структуре данных БД - это правило. Правило, которое использует в своей работе подсистема контроля данных сервера БД, подсистема проверки целостности и непротиворечивости данных.
Данное правило в интерпретации подсистемы звучит так - значение зависимого поля, если оно не NULL, должно присутствовать среди значений зависящего поля.
Практически все СУБД для поддержания эффективности выполнения такой проверки требуют наличия в референсной таблице индекса по выражению внешнего ключа, или по крайней мере индекса, в котором это выражение является префиксом. Проверка при наличии индекса выполняется на порядки быстрее, если такого индекса нет. Кроме того, для однозначности зависимости практически все СУБД требуют, чтобы этот индекс был уникальным. Некоторые СУБД также требуют наличия индекса (но уже без требования уникальности) и в зависимой таблице.
Проверка данных по внешнему ключу выполняется при практически любом изменении данных (т.е. при выполнении операции, потенциально способной повлиять на истинность этого правила для всех имеющихся записей). При попытке вставить не-NULL значение либо изменить его на такое, которого нет в референсной таблице, или при попытке изменить значение в референсной таблице, на которое есть ссылки, подсистема заблокирует изменение, потому что оно сделает данные не соответствующими этому правилу.
На выполнение выборок наличие ключа не влияет. Вообще никак. Потому что выборка не изменяет данные, и правило внешнего ключа соответственно не требуется. А вот наличие индекса, требующегося для эффективной работы - влияет. Как и любой другой индекс, не связанный с внешним ключом.