Схема базы данных - PullRequest
       2

Схема базы данных

0 голосов
/ 02 июня 2018

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

Решение 1:

CREATE TABLE `user_matches` (
  `user_id_1` int(11) NOT NULL,
  `user_id_2` int(11) NOT NULL,
  `like_user_1` tinyint(1) DEFAULT '0',
  `like_user_2` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`user_id_1`,`user_id_2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Чтобы выбрать сопоставление среди двухпользователи, которым я должен написать этот запрос:

SELECT * 
FROM user_matches
WHERE (user_id_1 = 123 OR user_id_2 = 123) AND (like_user_1 = 1 AND like_user_2 = 1)

PS: представьте, что like_user_1 и like_user_2 проиндексированы

Решение 2:

CREATE TABLE `user_matches` (
  `user_id` int(11) NOT NULL,
  `user_id_liked` int(11) NOT NULL,
  PRIMARY KEY (`user_id`,`user_id_liked`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Чтобы выбрать совпадение среди пользователей, я должен написать этот запрос:

    SELECT me.user_id_liked
    FROM user_matches me
    INNER JOIN user_matches you ON me.user_id = you.user_id_liked 
                                AND you.user_id = me.user_id_liked 
                                AND me.user_id = 123

Я думаю, что 2-е решение является лучшим для схемы и для запросов, потому что предложения from и join выполняются перед предложением where, но в предложениито же самое время в первом решении мне не нужно объединять таблицы.

1 Ответ

0 голосов
/ 02 июня 2018

Если вы индексируете like_user_1 и like_user_2 для запросов решения 1, это должно быть быстро.

Я бы протестировал оба решения и сравнил планы выполнения.EXPLAIN и EXPLAIN EXTENDED будут полезны.

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