powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Не могу придумать структуру БД
18 сообщений из 18, страница 1 из 1
Не могу придумать структуру БД
    #39508733
stoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача примерно такая:

Придумать структуру для каталогизатора допустим фотографий.
Есть простая таблица со ссылками на файлы фотографий.
Пользователь может добавлять неограниченное количество собственных фильтров (тегов).
У каждого из фильтров может быть задано произвольное число предопределенных значений.
К примеру:
Фильтр "Место съемки". Значения "Москва", "Тамбов", "Мухосранск"
Фильтр "Время съемки". Значения "Утром", "Днем", "Вечером"

ВАЖНО! Для одной фотографии не может быть задано более одного значения одного фильтра.
Т.е. у Фото1 не может соответствовать два разных значения фильтра(тега) "Место съмки" - "Москва" и "Мухосранск".

Вроде задача несложная. Но оптимальную структуру БД придумать не могу.
Допустим так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE [cards](
    [front] TEXT NOT NULL, 
    [back] TEXT NOT NULL);

CREATE TABLE [cardsfiltresvalues](
    [card] TEXT NOT NULL REFERENCES cards, 
    [filtervalue] TEXT NOT NULL REFERENCES filtresvalues, 
    [filter] TEXT NOT NULL REFERENCES filtres, 
    UNIQUE([card], [filter]));

CREATE TABLE [filtres](
    [name] TEXT NOT NULL);

CREATE TABLE [filtresvalues](
    [filter] TEXT NOT NULL REFERENCES filtres, 
    [value] TEXT NOT NULL);



Здесь у меня не фотографии, а некие "cards". Но роли не играет.
Линковочная таблица cardsfiltresvalues мне не нравится. По идее, колонка "filter" не нужна. Ибо у значения колонки "filtervalue" уже есть родительский элемент и его можно получить. Но если её убрать - как добиться уникальности UNIQUE([card], [filter])?
А с ней - нет гарантии что родительский элемент значения "filtervalue" будет совпадать с значением колонки "filter". А должен обязательно...

Что я делаю не так? Тип СУБД не очень важен. Мне важно понять - как решается такая задача. Ведь не я ж первый её решаю, явно.
Спасибо за помощь!
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508734
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stoiВАЖНО! Для одной фотографии не может быть задано более одного значения одного фильтра.


На практике - не факт
Тема: животные/юмор
Участники: Родственники/коллеги
Вполне может существовать несколько значений в одном теге.
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508736
stoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВполне может существовать несколько значений в одном теге.
Да. Но задача взята для примера. Там не фотографии в реальности. И нужно именно ОДНО значение.
Вот это всё и портит ))
Ну или я туплю...
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508773
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет, наоборот облегчает.

Непонятен подход к проектирования структуры БД.
Это явно не делается через скрипты её создания.
+ Отсутствуют ID поля.
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508780
stoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183, Да бог с ним с подходом ) Дался он вам!
Признаюсь, я не дока в проектировании БД. Просто набросал в SQLite Expert БД, а сюда выложил ddl.
Еще на бумажке диаграммы рисовал. Но их выложить сложнее ).

У вас по сути вопроса есть какие-нибудь предложения?
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508781
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много буков
почистил, добавил ID, осталось добавить комменты, а потом можно думать

[cards].[id]
[cards].[front]
[cards].[back]

[cardsfiltresvalues]. [card_id]
[cardsfiltresvalues]. [filtervalue]
[cardsfiltresvalues]. [filter]

[filtres].[id]
[filtres].[name]

[filtresvalues] .[ filtres id]
[filtresvalues] .[cardsfiltresvalues_id]
[filtresvalues]. [value]

Не вижу справочника "тегов"
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508789
stoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183, Применительно к фотографиям, будет так:

[photos].[id]
[photos].[path]

[photostagsvalues]. [photo_id]
[photostagsvalues]. [tags_id]
[photostagsvalues]. [tagsvalues_id]

[tags].[id]
[tags].[name]

[tagsvalues] .[id]
[tagsvalues] .[tags_id]
[tagsvalues]. [value]
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508793
stoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А еще лучше так (изменил порядок таблиц):

[photos].[id]
[photos].[path]

[tags].[id]
[tags].[name]

[tagsvalues] .[id]
[tagsvalues] .[tags_id]
[tagsvalues]. [value]


[photostagsvalues]. [photo_id]
[photostagsvalues]. [tags_id]
[photostagsvalues]. [tagsvalues_id]

Ключевая таблица - последняя. Она связывает фотографии со значениями тэгов.
Можно удалить лишнее поле tags_id и получится:
[photostagsvalues]. [photo_id]
[photostagsvalues]. [tagsvalues_id]

И всё б хорошо, но тогда не получится обеспечить уникальность пар photo_id <-> tags_id
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508799
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты хочешь это сделать на уровне БД?
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508801
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хранить по второму варианту может быть и правильнее,
Но всё равно при вводе сначала надо выбрать тэг, потом его значение.
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508840
stoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183,

Я не знаю - можно ли сделать это на уровне БД. Потому и спрашиваю у профессионалов )
Любопытно - решаемо ли это на уровне БД?
авторХранить по второму варианту может быть и правильнее,
Но всё равно при вводе сначала надо выбрать тэг, потом его значение.

Тогда уникальность нужно контролировать при вводе данных. Каждый раз придется делать выборку. Неоптимально.
В первом варианте есть лишнее поле. Но зато при вводе ничего проверять не нужно. ИМХО - это более правильно.
Тем более - БД будет не сильно большая, одно лишнее поле - не утянет

Модератор: Тема перенесена из форума "SQLite".
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508929
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Вас что-то непонятное с ключами - например, что является ключом в cards?
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39508946
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел на более позднюю структуру 20741547
Почему бы Вам в tagvalues не сделать ключом (tag_id, value) и соответственно ссылаться на этот ключ из photostagsvalues? Таким образом ссылочная целостность не даст ввести в photostagsvalues значение tag_id, не соответствующее значению фильтра.
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39509003
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stoi, значения фильтров могут только браться из общего справочника или пользователь может ввести произвольный?
Скажем, в базе хранится, что Место съемки может быть "Москва", "Тамбов", "Мухосранск". Пользователь хочет ввести "Пенза". Разрешаем ему это и записываем в базу или посылаем куда подальше? Если разрешаем и записываем Пензу, то для следующей фотографии мы на выбор даём "Москва", "Тамбов", "Мухосранск", "Пенза" или только то, что было изначально? т.е. Пенза запишется к конкретной фотографии или нужно её положить в общую таблицу?
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39509081
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы нет?
Но это не вопрос к структуре БД.
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39509143
stoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Друг прислал диаграмму (в прикреплении). Говорит - нашел решение. Но из диаграммы непонятно - как создаются ключи (
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39509186
stoi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сам себе отвечу. Друг решил задачку. Респект ему. Я пошел читать про внешние составные ключи...

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
CREATE TABLE [photos] (
	[photo_id]	integer PRIMARY KEY AUTOINCREMENT NOT NULL,
	[photo_value]	nvarchar(100) NOT NULL COLLATE NOCASE

);

CREATE TABLE [photos_tags_values](
    [photo_id] integer NOT NULL REFERENCES photos([photo_id]) ON DELETE NO ACTION ON UPDATE CASCADE, 
    [tag_id] integer NOT NULL, 
    [tag_value_id] integer NOT NULL, 
    PRIMARY KEY([tag_id], [tag_value_id]), 
    FOREIGN KEY([tag_id], [tag_value_id]) REFERENCES tag_values([tag_id], [tag_value_id]) ON DELETE NO ACTION ON UPDATE CASCADE);

CREATE TABLE [tags] (
	[tag_id]	integer PRIMARY KEY AUTOINCREMENT NOT NULL,
	[tag_value]	varchar(100) NOT NULL COLLATE NOCASE

);

CREATE TABLE [tag_values](
    [tag_value_id] integer NOT NULL, 
    [tag_id] integer NOT NULL REFERENCES tags([tag_id]) ON DELETE NO ACTION ON UPDATE CASCADE, 
    [value] varchar(30) NOT NULL COLLATE NOCASE, 
    PRIMARY KEY([tag_id], [tag_value_id]));

CREATE UNIQUE INDEX [photos_tags_values_photos_tags_values_uq]
ON [photos_tags_values](
    [photo_id] DESC, 
    [tag_id] DESC);

CREATE UNIQUE INDEX [tag_values_tag_values_uq]
ON [tag_values](
    [tag_id] DESC, 
    [value] DESC);

CREATE UNIQUE INDEX [tag_values_UQ__tag_valu__AD4EDF21FEECC733]
ON [tag_values](
    [tag_value_id] DESC);
...
Рейтинг: 0 / 0
Не могу придумать структуру БД
    #39509204
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stoiСам себе отвечу. Друг решил задачку. Респект ему. Я пошел читать про внешние составные ключи...

20742255
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Не могу придумать структуру БД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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