Итак, допустим, у меня есть таблица users
и таблица pages
. Допустим, я хочу позволить пользователям скрывать / забывать / игнорировать определенные страницы. На данный момент, я могу думать о двух возможных подходах:
Внешнее соединение с null
соответствием:
Я могу создать отдельную таблицу ignored_pages
со столбцами user_id
и page_id
, записывая в нее INSERT INTO ignored_pages (user_id, page_id) VALUES (1,2);
, когда пользователь с идентификатором 1 игнорирует страницу с идентификатором 2.
Тогда я могу запустить что-то вроде SELECT pages.* FROM pages LEFT OUTER JOIN ignored_pages ON pages.id = ignored_pages.page_id WHERE ignored_pages.user_id = 1 AND ignored_pages.id IS NULL;
РЕДАКТИРОВАТЬ: Джо Стефанелли указал на ошибку в моем запросе. Должно быть SELECT pages.* FROM pages LEFT OUTER JOIN ignored_pages ON pages.id = ignored_pages.page_id AND ignored_pages.user_id = 1 WHERE ignored_pages.id IS NULL;
Подзапрос и NOT IN
:
Я могу использовать ту же таблицу «многие ко многим», а затем запустить что-то вроде SELECT pages.* FROM pages WHERE page_id NOT IN (SELECT page_id FROM ignored_pages WHERE user_id = 1);
.
Есть ли лучшая практика или ряд практических правил или (вероятно) лучший подход к этой проблеме, чем тот, который я использую?