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

12
danforth
На сайте с 18.12.2015
Offline
153
#11

В теории реляционных моделей данных, такой вариант дизайна называется Associative Entity, и он абсолютно правильный. Иногда используется и для O:O (One:One) связей в том числе, чтобы не плодить жирные таблицы (тогда PK делают на какой-то один столбец, для которого нужно соблюдать уникальный констрейнт).

Запрос вам уже скинули, можете сделать PRIMARY KEY (ArticleId, AuthorId), и рядом повесить индекс на AuthorId, но без ArticleId.

В InnoDB PK автоматически добавляется в индекс (covering index).

Либо ещё лучше - сделать FK, с нужными вами проверками интеграционности, как в примере ниже, только добавив, например RESTRICT или CASCADE.

Вот тут три варианта запроса, все три имеют одинаковый результат, и разный план выполнения. Второй вариант скорее всего будет самый производительный на больших таблицах.

Junior Web Developer
S
На сайте с 23.05.2004
Offline
315
#12

Самый правильный вариант уже указан вначале - число статей к автору. Это всего лишь повесить тригер на сохранение/удаление статьи, что бы посчитать число статей и обновить его у автора.

Это кажется сначала чуть сложнее, но потом дико облегчит жизнь, когда надо будет по числу статей делать сортировки или просто выводить данные автора.

Это просто подпись.
edogs software
На сайте с 15.12.2005
Offline
775
#13
LEOnidUKG:
Пробовали запускать когда таблица весит по 2 ГБ и записей более 1 млн? :)

Именно в подобных случаях ничего страшного не будет.

По двум причинам:

Первая и самая важная - первоочередная выборка будет по таблице коннектору ArticleAuthors, которая даже при 2 млн записей и int-ах под ИД-шники займет всего 16мб. Выборка же из articles/authors будет уже по примариИД, т.е. реактивной в любом случае.

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

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
danforth
На сайте с 18.12.2015
Offline
153
#14

Кстати, на заметку автору, я вот тут писал про табличку с почти 3 млрд. записей, на 77Гб, и никаких проблем с производительностью не возникало, а с партициями вообще работало супер.

Lazy Badger
На сайте с 14.06.2017
Offline
228
#15
Gerga:
Данная структура учитывает отношение "многие-ко-многим"

Так-то он так. Но вот только в данном конкретном случае где в "автор-документ" (документ - не просто "документ", а пост на сайте) many-2-many? У 99% CMS автор - 1 шт.

Учил вас старик Аким, учил, а все без толку: "Не умножайте число сущностей сверх необходимого"

---------- Добавлено 09.05.2019 в 14:31 ----------

Sitealert:
На самом деле, быстрее сдохнет
Код: IN (SELECT ... )
Мускуль не умеет оптимизировать такую конструкцию, насколько я помню.

Не умел, но это было много лет тому как... сейчас (возможно) ситуация отличается, т.к. квалификация DBA падает стремительным домкратом, а вложенные селекты идут в гору, как простое костыльное решение

Производство жести методом непрерывного отжига
LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#16
edogs:
Именно в подобных случаях ничего страшного не будет.
По двум причинам:
Первая и самая важная - первоочередная выборка будет по таблице коннектору ArticleAuthors, которая даже при 2 млн записей и int-ах под ИД-шники займет всего 16мб. Выборка же из articles/authors будет уже по примариИД, т.е. реактивной в любом случае.
Вторая - то что при count(articleid) выборка вообще будет по ключам, даже без обращения к самой таблице, что еще прибавит реактивности, особенно если ключи в память попадут (а куда они денуться при таком размере).

Не буду спорить, возможно и так. В любом случаи такое надо тестировать на практике.

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

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
UL
На сайте с 04.08.2013
Offline
68
#17
LazyBadger:
Так-то он так. Но вот только в данном конкретном случае где в "автор-документ" (документ - не просто "документ", а пост на сайте) many-2-many? У 99% CMS автор - 1 шт.

Для моих целей нужно учитывать, что у статей может быть несколько авторов.

S
На сайте с 23.05.2004
Offline
315
#18

Грамотно спроектировать бд - одна задача. Быстро выводить инфу - другая. И между этими двумя задачами часто используется прослойка в виде агрегации данных.

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

UL
На сайте с 04.08.2013
Offline
68
#19

SELECT a.id, a.name
FROM author a
JOIN (
SELECT author_id
FROM author_article
GROUP BY author_id
HAVING COUNT(*) > 2
) t ON a.id = t.author_id;

На что указывают эти сокращения a.id, a.name, author a, t ON a.id, буква ''t''?

S
На сайте с 30.09.2016
Offline
469
#20
use_linux:
На что указывают эти сокращения a.id, a.name, author a, t ON a.id, буква ''t''?

В гугле забанили?

Читай доки.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
12

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