Я пытаюсь создать базу данных пользователей для веб-сайта, в котором будут храниться значения корреляции между всеми пользователями. Я имею в виду, что для каждой пары пользователей существует сохраненное значение корреляции между двумя пользователями.
Значения корреляции будут вычисляться PHP с использованием алгоритма корреляции. Мой вопрос в том, что является самым правильным способом их хранения в базе данных MySQL? Я понимаю, что мог бы сделать такой стол:
--------------------------------- | user1 | user2 | user3 | etc... | ----------------------------------------- | user1 | #val | #val | #val | #val | ----------------------------------------- | user2 | #val | #val | #val | #val | ----------------------------------------- | user3 | #val | #val | #val | #val |
и так далее. Но мне этот метод не нравится, потому что
Каковы мои альтернативы? Если это можно сделать в MySQL хорошо, как мне это сделать?
Если это не может быть сделано хорошо в MySQL, есть ли другие типы баз данных, которые я должен попытаться изучить? Например, я понимаю, что система базы данных графов может хорошо работать для этого, но я не хочу тратить время на изучение того, как использовать базу данных графа, если это можно сделать в MySQL.
Обычно вы делаете что-то подобное в таблице JOIN. Поэтому скажите, что у вас есть таблица users
с полем user_id
и любыми другими полями, которые вам нужны. Вы могли бы создать таблицу с именем user_relations
или аналогичную, которая просто имела бы два поля user_id постороннего ключа, которые каким-то образом связывают пользователей.
user_id_1 | user_id_2 ------------------------ 1 | 2 1 | 3 2 | 1 3 | 1 ... | ...
Тогда у вас будет составной первичный ключ для обоих столбцов, чтобы обеспечить уникальность. Обратите внимание, что я предполагаю, что #val
, о #val
вы упоминали в своем вопросе, был просто своего рода флагом (1/0), который представляет собой существование отношения. Если вам действительно нужно это значение, чтобы объяснить что-то о взаимоотношениях (то есть родитель / ребенок или какое-либо другое значащее значение), вы можете обрезать третий столбец этой таблицы, чтобы сохранить значение, связанное с этим отношением.
Когда вам нужно запросить отношение, вы можете сделать это следующим образом:
SELECT u1.*, u2.* FROM users AS u1 INNER JOIN user_relations AS ur ON u1.user_id = ur.user_id_1 INNER JOIN users AS u2 ON ur.user_id_2 = u2.user_id WHERE u1.user_id = ? /* or whatever filter you may need to apply */
Обратите внимание, что в зависимости от того, какой тип отношений вы пытаетесь представить (т. Е. Двусторонняя связь), вам может понадобиться две строки в таблице для представления каждой взаимосвязи. Таким образом, вы всегда можете использовать первый столбец для поиска всех связанных пользователей во втором столбце. Это показано в моем примере выше, где отношения пользователя один отображаются в обоих направлениях в значениях строк выборки.
Блестящий вопрос.
Учитывая пользователей A, B, C, D и E, ваш набор данных является треугольным;
ABCDE AB * C * * D * * * E * * * *
Таким образом можно сохранить треугольный набор данных в базе данных SQL, ориентированной на таблицы;
id usr usr c ------------ 0 AB 1 1 AC 5 2 AD 3 3 AE 4 4 BC 3
и т.д
На мой взгляд, лучшим решением является наличие 2 таблиц … Пользователи и пользователиРелерации
UserRelations:
==================================== User1Field | User2Field | ValueField ==================================== #User | #User | #val ------------------------------------ #User | #User | #val ------------------------------------ #User | #User | #val ------------------------------------