Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Пару вопросов о проектировании на простом примере из 3-х таблиц / 14 сообщений из 14, страница 1 из 1
07.11.2017, 20:21
    #39549233
sameuser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
Добрый вечер.

Есть таблица user , в которой располагаются пользователи
Есть таблица item с товарами.
И есть таблица rating , в которой содержатся выставленные пользователями оценки товарам.

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

Вопросы:

1. Каким образом можно обеспечить уникальность записей в таблице рейтинга? Имеется в виду выполнение условия "каждый пользователь может выставить только одну оценку тому или иному товару".

2. Нужен ли в таблице рейтинга дополнительный индекс (обычно с автоинкрементом)? Он же primary key. На скриншоте отсутствует.

3. Рейтинг товара не может существовать сам по себе, он обязательно выставляется пользователем. Должна в этом случае связь между таблицей пользователей и таблицей рейтингов быть идентифицирующей ? На скриншоте она таковой не является.
...
Рейтинг: 0 / 0
07.11.2017, 20:43
    #39549240
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
sameuser,

1) составной PK
2) зачем?
3) неясен вопрос. Два FK нужны.
...
Рейтинг: 0 / 0
07.11.2017, 21:14
    #39549246
sameuser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
Кроме составного внешнего ключа есть другие варианты?
...
Рейтинг: 0 / 0
07.11.2017, 21:19
    #39549247
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
sameuser,

как и главное куда вы собрались вешать составной внешний ключ?
...
Рейтинг: 0 / 0
07.11.2017, 22:10
    #39549262
sameuser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
Я ничего не собирался вешать.
Вопросы темы перечислены в первом сообщении.
...
Рейтинг: 0 / 0
07.11.2017, 22:26
    #39549265
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
sameuserКроме составного внешнего ключа есть другие варианты?Индексы (в т.ч.составные), в т.ч. обслуживающие внешние ключи - единственный штатный механизм контроля и поддержания целостности и непротиворечивости информации. Любые "другие варианты" - это квадратноколёсый велосипед.
...
Рейтинг: 0 / 0
11.11.2017, 20:21
    #39551567
sameuser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
Подскажите, как создать составной ключ в таблице rating , используя внешние ключи fk_user_id и fk_item_id ?

В этом случае, если я правильно понимаю, нельзя будет добавить в таблицу rating запись, которая в ней уже существует:

Код: css
1.
2.
3.
4.
5.
6.
7.
8.
fk_user_id        fk_item_id        rating_value

1                 1                 1     // юзер № 1, товар № 1, оценка "1" - ОК
2                 1                 1     // юзер № 2, товар № 1, оценка "5" - ОК
1                 2                 5     // юзер № 1, товар № 2, оценка "1" - ОК
1                 8                 1     // юзер № 1, товар № 8, оценка "1" - ОК
...
1                 1                 1     // юзер № 1, товар № 1, оценка "1" - ошибка, такая запись уже есть



Именно это поведение мне и нужно.
...
Рейтинг: 0 / 0
11.11.2017, 20:23
    #39551568
sameuser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
Ошибся малость.. Хреново, что нельзя редактировать сообщения.

Код: css
1.
2.
3.
4.
5.
6.
7.
8.
fk_user_id        fk_item_id        rating_value

1                 1                 1     // юзер № 1, товар № 1, оценка "1" - ОК
2                 1                 1     // юзер № 2, товар № 1, оценка "1" - ОК
1                 2                 5     // юзер № 1, товар № 2, оценка "5" - ОК
1                 8                 1     // юзер № 1, товар № 8, оценка "1" - ОК
...
1                 1                 1     // юзер № 1, товар № 1, оценка "1" - ошибка, такая запись уже есть
...
Рейтинг: 0 / 0
11.11.2017, 22:18
    #39551593
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
sameuser1. Каким образом можно обеспечить уникальность записей в таблице рейтинга? Имеется в виду выполнение условия "каждый пользователь может выставить только одну оценку тому или иному товару".


...двойной уникальный ключ в который входят оба внешние референсы
на юзера и на товар...

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

...алтернативно, такое базнес-правило может отрабатывать на клиенте...

...алтернативно такое бизнес правило может отрабатыватся тригером на вставку...

...алтернативно такое можте отрабатыватся МЕРЖЕ-ИНСЕРТ
СКЛ на вставке....

...последние 3 варианта не рекомендуются но все же легитимны.
...
Рейтинг: 0 / 0
11.11.2017, 22:23
    #39551594
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
sameuser2. Нужен ли в таблице рейтинга дополнительный индекс (обычно с автоинкрементом)? Он же primary key. На скриншоте отсутствует.

...для стабильной базы -- нет
...с точки зрения ДБА -- нет
...с точки зрения клиентского кода -- часто клиентские фрейворки "любят"
ПК на одну колонку. Некоторые фрейворки потребуют
дополнительный код для работы с мнобо-полевым ПК
...иногда ДБ архитекторы предпочитают прописать в
стандарте проектирования что бы ВСЕ таблицы имели
ИНТЕГЕР аутоикренет ПК.
...
Рейтинг: 0 / 0
11.11.2017, 22:29
    #39551596
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
sameuser3. Рейтинг товара не может существовать сам по себе, он обязательно выставляется пользователем. Должна в этом случае связь между таблицей пользователей и таблицей рейтингов быть идентифицирующей ? На скриншоте она таковой не является.


...на логическом уровне конечно эта связа есть "иденцифицируюшая"
...на физическом уровне она может входить в ПК или в ФК NOT NULL ,
как показано в моем предыдущем посте.
...
Рейтинг: 0 / 0
12.11.2017, 01:20
    #39551625
sameuser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
Использование фреймворков не планируется ( там черт ногу сломит, понагородили столько, что проще самому написать. Особенно yii2 - мрак ). На мой взгляд, конечно.. Кому-то, может, наоборот нравится работать в такой среде..

Спасибо за подробные ответы.

автор...двойной уникальный ключ в который входят оба внешние референсы
на юзера и на товар...

ALTER TABLE `rating` ADD UNIQUE (fk_user_id, fk_item_id);

Синтаксис верный? В MySQL Workbench я не нашел GUI-функционал, который помогает это создать.

В этом случае при добавлении уже имеющейся записи произойдет ошибка, верно? Записи, которая содержит fk_user_id, fk_item_id, которые уже были внесены ранее.
...
Рейтинг: 0 / 0
12.11.2017, 07:20
    #39551634
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
>> Использование фреймворков не планируется ( там черт ногу сломит, понагородили столько, что проще самому написать. Особенно yii2 - мрак ). На мой взгляд, конечно.. Кому-то, может, наоборот нравится работать в такой среде..

если других аргуметнов нет, и вы единственый кто будет
кодировать клиентски код -- то делайте как
вам самому удобно.

>> Спасибо за подробные ответы.

всегда пожалуйста

...

>> ALTER TABLE `rating` ADD UNIQUE (fk_user_id, fk_item_id);
>> Синтаксис верный?

кажется верный, я не помню точно, посмотрите в справочнике или
просто проверте прогоном...

Так можено но имя констраин или имя индекса будет сгенерировано.
так тоже можно:
ALTER TABLE `rating` ADD CONSTRAIN IDX_3456 UNIQUE (fk_user_id, fk_item_id);

>> В MySQL Workbench я не нашел GUI-функционал, который помогает это создать.

в МыСКЛ-е уникалость делается как уникальный индекс --
функционал создания которого находится в ИНДЕКС табе...

>> В этом случае при добавлении уже имеющейся записи произойдет
ошибка, верно? Записи, которая содержит fk_user_id, fk_item_id,
которые уже были внесены ранее.

...ну да....
...хотя зачем вам мне верить -- быстрее проверить прямо на базе :-)

CREATE TABLE IF NOT EXISTS `test` (
`id` INT NOT NULL ,
`col1` INT NOT NULL ,
`col2` INT NOT NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `index2` USING BTREE (`col1` ASC, `col2` ASC) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Data for table `mydb`.`test`
-- -----------------------------------------------------
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`test` (`id`, `col1`, `col2`) VALUES (1, 2, 2);
INSERT INTO `mydb`.`test` (`id`, `col1`, `col2`) VALUES (2, 2, 2);

COMMIT;
...
Рейтинг: 0 / 0
21.11.2017, 06:29
    #39556510
sameuser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пару вопросов о проектировании на простом примере из 3-х таблиц
Спасибо за советы. Вопрос решился созданием индекса типа UNIQUE по двум внешним ключам.
При вставке уже существующего значения выдает ошибку, что и нужно было.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Пару вопросов о проектировании на простом примере из 3-х таблиц / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]