Как сохранить значения корреляции между пользователями в базе данных с использованием MySQL и PHP?

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

Значения корреляции будут вычисляться PHP с использованием алгоритма корреляции. Мой вопрос в том, что является самым правильным способом их хранения в базе данных MySQL? Я понимаю, что мог бы сделать такой стол:

--------------------------------- | user1 | user2 | user3 | etc... | ----------------------------------------- | user1 | #val | #val | #val | #val | ----------------------------------------- | user2 | #val | #val | #val | #val | ----------------------------------------- | user3 | #val | #val | #val | #val | 

и так далее. Но мне этот метод не нравится, потому что

  • Он хранит каждое значение дважды; например, корреляция между user1 и user3 сохраняется в столбце 3 строки 1, а также в столбце 1 строки 3.
  • Я использую подготовленные операторы, что означает, что я не могу выбирать столбцы с именами, указанными после идентификаторов пользователей, если я не свяжу идентификатор пользователя с SQL-оператором, что, очевидно, не является идеальным.

Каковы мои альтернативы? Если это можно сделать в 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 * * * * 
  1. В приведенной выше матрице AA, BB, CC, DD и EE не имеют смысла.
  2. Чтобы избежать дублирования, AB совпадает с BA. CD такой же, как у DC, и так далее.

Таким образом можно сохранить треугольный набор данных в базе данных 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 ------------------------------------