Вопрос по проектированию бд mysql (интересный)

12
UL
На сайте с 04.08.2013
Offline
62
1338

INSERT INTO ArticleAuthors

(ArticleId, AuthorId)
VALUES
(1, 1),
(2, 1),
(3, 1),
(4, 2),
(5, 2),
(6, 3),
(7, 4),
(7, 5),
(7, 6),
(7, 7),
(7, 8)

Это запрос к таблице-посреднику между таблицами со статьями и с авторами. Эта таблица устанавливает соответствие между статьями и авторами посредством идентификаторов. Вопрос-то на самом деле следующий: при такой структуре я могу сделать выборку авторов, например, тех у кого >=5, >= 10 статей? Мне просто хватит алгоритма. Или бд спроектирована неправильно для этого? Вот решить этот вопрос затрудняюсь(

S
На сайте с 30.09.2016
Offline
469
#1
use_linux:
Или бд спроектирована неправильно для этого?

Обычная структура.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
LEOnidUKG
На сайте с 25.11.2006
Online
1590
#2

Изучайте JOIN LEFT, чтобы разные таблицы собирать в одну.

✅ Трастовых площадок под размещение статей и ссылок. Опыт 12 лет! ( https://searchengines.guru/ru/forum/675690 ) ⭐ Купить вечные трастовые ссылки для сайта ( https://getmanylinks.ru/?srh ) ⭐ Ускорение ваших сайтов (WP, Opencart и др.) + Настройка сервера ( https://searchengines.guru/ru/forum/997205 )
SS
На сайте с 15.12.2015
Offline
62
#3

Как вариант добавить в таблицу к авторам поле которое показывает количество активных статей. Обновлять его можно например при добавлении статьи или удалении, зависит от ваших требований, или триггеры попытаться использовать под эти нужды.

Размещение естественных ссылок на тематических порталах, отзовиках, справочниках (/ru/forum/1013919)
LEOnidUKG
На сайте с 25.11.2006
Online
1590
#4
SERM-service:
Как вариант добавить в таблицу к авторам поле которое показывает количество активных статей. Обновлять его можно например при добавлении статьи или удалении, зависит от ваших требований, или триггеры попытаться использовать под эти нужды.

Вполне нормальный вариант т.к. COUNT в mysql очень ресурсоёмкий запрос.

imaster-php
На сайте с 02.05.2019
Offline
8
#5

Можно было бы сразу в таблице статей указывать ID автора.

Но раз уж так спроектировали БД, то для выборки можете использовать запрос

SELECT * FROM `Authors` WHERE `id` IN (SELECT `AuthorId` FROM `ArticleAuthors` GROUP BY `AuthorId` HAVING COUNT(ArticleId) >= 5
Хостинг для сайта ( https://good-hoster.ru ) - сервис по выбору хостинга
LEOnidUKG
На сайте с 25.11.2006
Online
1590
#6
HAVING COUNT

Пробовали запускать когда таблица весит по 2 ГБ и записей более 1 млн? :)

imaster-php
На сайте с 02.05.2019
Offline
8
#7

Пробовали запускать когда таблица весит по 2 ГБ и записей более 1 млн?

С чего вы взяли, что у use_linux в проекте такая огромная таблица?

UL
На сайте с 04.08.2013
Offline
62
#8
LEOnidUKG:
Пробовали запускать когда таблица весит по 2 ГБ и записей более 1 млн? :)

imaster-php в данном случае прав, для моих целей сойдет, я рассчитываю на не более 2-3 тыс. А потом видно будет.

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

---------- Добавлено 07.05.2019 в 20:17 ----------

imaster-php:
Можно было бы сразу в таблице статей указывать ID автора.
Но раз уж так спроектировали БД, то для выборки можете использовать запрос
SELECT * FROM `Authors` WHERE `id` IN (SELECT `AuthorId` FROM `ArticleAuthors` GROUP BY `AuthorId` HAVING COUNT(ArticleId) >= 5

Ваш код приспособил, работает пока. Хотя, я бы хотел чуть иначе. На самом деле, если таблица будет большая - будет накладно.

---------- Добавлено 07.05.2019 в 20:19 ----------

LEOnidUKG:
Изучайте JOIN LEFT, чтобы разные таблицы собирать в одну.

то-то и оно! прокачаться надо в sql. Простые запросы я научился составлять, а как доходит до чего-нить подобного...

Gerga
На сайте с 02.08.2015
Offline
94
#9
imaster-php:
Можно было бы сразу в таблице статей указывать ID автора.

Не вариант, что подойдет. Данная структура учитывает отношение "многие-ко-многим", возможно именно это отношение и закладывалось при реализации данной структуры.

---------- Добавлено 07.05.2019 в 19:22 ----------

use_linux, этот /ru/forum/comment/16053116 вариант можете реализовать.

S
На сайте с 30.09.2016
Offline
469
#10
LEOnidUKG:
Пробовали запускать когда таблица весит по 2 ГБ и записей более 1 млн? :)

На самом деле, быстрее сдохнет

IN (SELECT ... )
Мускуль не умеет оптимизировать такую конструкцию, насколько я помню.
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий