Каков правильный дизайн реляционной базы данных для хранения отзывов клиентов для разных поставщиков?

#mysql #database #database-design #relational-database

Вопрос:

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

Вот мои таблицы (я упрощаю их для целей этого вопроса):

таблица поставщиков

 vendor_id | vendor_name | vendor_location | vendor_email       | vendor_phone
1         | User One    | LocationOne     | emailOne@test.com  | 000000001
2         | User Two    | LocationTwo     | emailTwo@test.com  | 000000002
 

reviews_table

 review_id | customer_name | rating | review_text | vendor_id
1         | Customer One  | 5      | mediumtext  | 2
2         | Customer Two  | 2      | mediumtext  | 1
3         | Customer 3    | 5      | mediumtext  | 2
4         | Customer 4    | 5      | mediumtext  | 2
 

Мой вопрос: имеет ли это смысл? Было бы лучше создать таблицу ссылок, называемую vendor_reviews review_id внешними ключами и vendor_id в качестве внешних ключей? Если да, то почему он должен быть лучше, чем нынешний дизайн?

Ответ №1:

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

Обзорная таблица

 review_id | customer_id | rating | review_text | vendor_id
 

И столик для клиентов

 customer_id | customer_name .....
 

С другой стороны, если у вас нет таблицы клиентов, у вас не может быть связи n:m.

Вместо этого сохраните свой дизайн, поскольку это всего лишь отношения 1 к 1 между поставщиком и проверкой

Комментарии:

1. У меня проблемы с тем, чтобы разобраться в отношениях с н-м. В моей ситуации рецензенты будут похожи на раздел общественного обсуждения в блоге. Таким образом, любой желающий может оставить отзыв. Я думал о том, что каждый рецензент (поскольку у них на самом деле нет учетной записи) просто опубликует отзыв и будет иметь идентификатор поставщика в одной строке. Но я, похоже, не могу понять, как будет иметь смысл использовать bridge-таблицу vendor_reviews (хотя я знаю, что у одного поставщика может быть несколько обзоров). О чем вы думаете?

2. если у вас нет таблицы клиентов, у вас не может быть соотношения n:m между отзывом и поставщиком, потому что у вас есть соотношение 1:1 между отзывом и поставщиком

3. В этом есть прекрасный смысл. Спасибо!

Ответ №2:

Не 1:1-Есть «много» отзывов для каждого поставщика «1». Таким образом, это 2 таблицы, с которых начинался @nTuply.

Если вы не идентифицируете «клиентов», то для них нет необходимости в таблице. То есть любой желающий может написать отзыв, придумать имя и т.д. Это делает его не многим:многим.

Если бы это было 1:1, вы могли бы также объединить таблицы.

1:много (или много:1) — Обратите внимание, что из каждой строки в «многих» ( reviews.vendor_id ) есть ссылка на «1» (таблица vendors ). У вас есть указатель на vendor_id in vendors , а именно на PRIMARY KEY . Вам нужен INDEX reviews вход, если вы хотите перечислить все отзывы для поставщика. A FOREIGN KEY является необязательным.

1:1 будет использовать общий первичный ключ.

Многие:для многих требуется дополнительная таблица, которая обычно состоит не более чем из двух столбцов-идентификаторов, ссылающихся на две таблицы. Два FOREIGN KEYs — это необязательно. Подробнее о многих:многих … http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table