powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Теги для каталога - как лучше спроектировать?
18 сообщений из 43, страница 2 из 2
Теги для каталога - как лучше спроектировать?
    #38903335
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только таблица связи (Master Ziv) - решение кривое "по определению": нарушение НФ в виде повторов в поле тегов для разных категорий, что ухудшает селективность индекса по полю - чуть более чем "гарантированно".


и гдеж там нарушение НФ-то?
Я как бы лет 15 уже базы данных проектную, ни разу ничего с нарушением НФ не делал.

Ну и вопрос дальнейшей "живучести" схемы. Как только понадобится (а мало ли!) вводить описания к тегам ... так всё - пиши "труба": таки придется создавать словарь тегов...


ну, так надо решать топик стартеру, и думать, что ему нужно. я опять-таки писал об этом с самого начала в каждом посте.
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38903527
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv , опишите, пожалуйста, как в ВАШЕЙ схеме устанавливать соответствие, фильтровать и получать статистику, если оператор набрал название тега с опечаткой, и это не было выявлено на стадии ввода.
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38903532
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

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

Это уже есть нарушение НФ ... 1-й? Не помню. :)

И оно же (повтор тегов) - снижает селективность индекса. А по практике (своей), могу сказать что часто теги к товарам И категориям настолько НЕ уникальны ... что просто без словаря - туго. Но ... это моя практика, а что там у ТС-а - только он знает. :)
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38903550
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы что тут все с утра посходили что ли?
весна действует?

все ж просто...

ладно, добавить до компа - отпишу все подробно, до последней детальки.
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38904680
wamaco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivвы что тут все с утра посходили что ли?
весна действует?

все ж просто...

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

у вас в корне все неверно!
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38905056
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wamacoMasterZivвы что тут все с утра посходили что ли?
весна действует?

все ж просто...

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

у вас в корне все неверно!сказал как отрезал
типа, ошибка настолько очевидна, что её даже объяснять никому не надо?
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38906745
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

кто-то обещался отписаться "как только" ... и? :)
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38906913
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

Что-то некогда...
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38906941
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

Вот типа того.
(процедуры написаны на умозрительном вымышленном языке, сметь PL/SQL и TransactSQL,
я MySQL наизусть не помню).

Код: sql
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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
create table catalogue
(
cat_id int not null,
cat_name varchar(255) not null,
-- ...                               
constraint pk_catalogue primary key( cat_id )
)

create table cat_tag
(
cat_id int not null,
tag varchar(255) not null,

constraint pk_cat_tag primary key( cat_id, tag ),
constraint un_cat_tag unique( tag, cat_id ),
constraint fk_cat_IN_cat_tag foreign key (cat_id) references catalogue ( cat_id );
);

-- эта таблица НЕ НУЖНА, если 
create table tag
(
tag varchar(255) not null,
-- .. tag attributes:
use_frequency_count int not null default 0,
-- end tag attributes
constraint pk_tag primary key( tag )
);


create procedure tag_catalogue ( @cat_id int, @tag varchar(255) )
begin

   -- только если нужна таблица TAG
   if not exists( select * from tag where tag = @tag ) then
     insert into TAG( tag, use_frequency_count )
     values ( @tag, 0 );
   end if;

   insert into cat_tag ( cat_id, tag )
   values ( @cat_id, @tag );

end;
/

create procedure get_catalogue_by_tag1 ( @tag varchar(255) )
begin

   select c.cat_id, cat_name
   from CAT c
   join cat_tag ct1 on ct1.cat_id = c.cat_id and cat1.tag = @tag;

end;
/

create procedure get_catalogue_by_tag2 ( @tag1 varchar(255), @tag2 varchar(255) )
begin

   select c.cat_id, cat_name
   from CAT c
   join cat_tag ct1 on ct1.cat_id = c.cat_id and cat1.tag = @tag1
   join cat_tag ct2 on ct2.cat_id = c.cat_id and cat2.tag = @tag2;

end;
/

create procedure get_catalogue_by_tag3 ( @tag1 varchar(255), @tag2 varchar(255), @tag3 varchar(255) )
begin

   select c.cat_id, cat_name
   from CAT c
   join cat_tag ct1 on ct1.cat_id = c.cat_id and cat1.tag = @tag1
   join cat_tag ct2 on ct2.cat_id = c.cat_id and cat2.tag = @tag2
   join cat_tag ct3 on ct3.cat_id = c.cat_id and cat3.tag = @tag3
;

end;
/
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38906958
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неясно, на что это ссылается внешний ключ
Код: sql
1.
constraint fk_cat_IN_cat_tag foreign key (cat_id) reference (cat)


Нет такой буквы в представленных DDL.
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38907073
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНеясно, на что это ссылается внешний ключ
Код: sql
1.
constraint fk_cat_IN_cat_tag foreign key (cat_id) reference (cat)


Нет такой буквы в представленных DDL.

да, сори, просто скопировал старый КПД, а потом таблицу переназвал по-другому.

должно быть
reference (catalogue)

модератор, исправьте пожалуйста.
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38907094
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivмодератор, исправьте пожалуйста.поправил
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38907100
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и на что ТЕПЕРЬ референс? на имя таблицы?
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38907116
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНу и на что ТЕПЕРЬ референс? на имя таблицы?


да ладно тебе, на pk таблицы, уж можно же догадаться.
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38907130
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНу и на что ТЕПЕРЬ референс? на имя таблицы?


references catalogue ( cat_id );
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38907138
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага... А теперь хочется получить ответ на вопрос . На ЭТОЙ структуре.
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38907189
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina MasterZiv , опишите, пожалуйста, как в ВАШЕЙ схеме устанавливать соответствие, фильтровать и получать статистику, если оператор набрал название тега с опечаткой, и это не было выявлено на стадии ввода.

Это зависит от постановки. Надо ли вообще это делать.

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

В случае, если множество тегов фиксированное, то нужно, естественно, хранить справочник тегов и не добавлять в него тег, как у меня в процедуре, а проверять его наличие в справочнике.
...
Рейтинг: 0 / 0
Теги для каталога - как лучше спроектировать?
    #38907987
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create procedure get_catalogue_by_tag2 ( @tag1 varchar(255), @tag2 varchar(255) )
begin

   select c.cat_id, cat_name
   from CAT c
   join cat_tag ct1 on ct1.cat_id = c.cat_id and cat1.tag = @tag1
   join cat_tag ct2 on ct2.cat_id = c.cat_id and cat2.tag = @tag2;

end;



А разве не проще вот такой запрос:

Код: sql
1.
2.
3.
4.
5.
SELECT c.cat_id, c.cat_name, COUNT(DISTINCT ct.tag) AS cnt
FROM CAT AS c
JOIN cat_tag AC ct ON ct.cat_id = c.cat_id AND ct.tag IN(@tags)
GROUP BY c.cat_id
HAVING cnt = @tags_count



@tags -- строки тегов через запятую ... лучше прямо с клиента...
@tags_count -- количество искомых тегов.

Не уверен за синтаксис и как сделать для процедуры, например с перенным числом параметров... но это один запрос, а не N-джойновый. :)
...
Рейтинг: 0 / 0
18 сообщений из 43, страница 2 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Теги для каталога - как лучше спроектировать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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