LINUX.ORG.RU

sqlite как сделать систему тегов

 , ,


0

2

Как делается система тегов? То есть у меня есть записи в базе, я хочу им присваивать ключи прозвольно, и при необходимости select'тить оттуда по списку ключей нужные записи.

Я слаб в базах, сейчас мне кажется что это классический случай many-to-many. Хочу понять так ли это.

Помышляю сейчас создать колонку tags и туда вставлять слова (теги/метки) с помощью обрамления, например вот так: [WORD], тогда при необходимости я смогу сделать SQL запрос нужный мне. Как итог там будет вот такая каша: [WORD 1][WORD 2][WORD WORD WOOOOORD]. Кажется это какой-то велосипед. Обрамления служат тут с той лишь целью чтобы слова не слипались между собой.


Классический реляционный вариант реализуется отдельной таблицей (отношением) таплов вроде {tag_id, record_id}, где сам тапл является уникальным ключём.

mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 1)

мне кажется что это классический случай many-to-many

Да, это отношение многие-ко-многим. Можно сделать и так, как ты описал (встречал такие примеры). Или же вспомнить, что sqlite это реляционная СУБД, и использовать во всю её реляционную мощь. Делаешь ещё одну таблицу tag, из двух колонок — id и name. Заполняешь её своими word1, word2, word_n. Проставляешь id'шники (ручками или автоматически, как умеешь). И делаешь прокси-таблицу tag2note, которая будет связывать твои записи и тэги. В прокси-таблице будет две колонки: note_id и tag_id. note_id будет ссылаться на твои записи, tag_id — на тэги. Лучше добавить ещё и колонку id в эту таблицу. Выборку делаешь через join, напирмер, выбираешь все записи из таблицы note с тегом word1:

SELECT * from `note` n
JOIN `tag2note` t2n on t2n.note_id=n.id
JOIN `tag` t on t2n.tag_id=t.id
WHERE
t.name="word1"

Как с этим разберёшься, почитай про поддержку foreign key в SQLite.

ivn86
()
CREATE table tag(
id integer not null primary key AUTOINCREMENT,
name varchar(500)
);

create table tag_tbl(
tbl_id integer not null,
tag_id integer not null,
FOREIGN KEY(tag_id) REFERENCES tag(id),
FOREIGN KEY(tbl_id) REFERENCES tbl(id)
);
pup_kin
()
Ответ на: комментарий от pup_kin

Для tag_tbl тоже нужен PRIMARY KEY и, возможно, ещё один индекс.

mashina ★★★★★
()

Еcли БД поддерживает массивы, то как альтернативу варианту, которые предложили джентльмены выше, можно рассматривать поле tags типа «массив строк». Однако, в общем случае вариант с таблицей связи будет более гибким и эффективным, хотя и будет требовать чуть больше телодвижений для реализации.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Спасибо! А может вы знаете, вот есть к примеру локальная база firebird, её имеет смысл использовать? Как замену sqlite, мне сейчас кажется что sqlite очень распространена и поэтому лучше в урезанном виде но работать именно с ней так как под неё многое уже существует, особенно GUI клиенты

rubro
() автор топика
Ответ на: комментарий от Deleted

Помимо поддержки массивов нужна еще и поддержка быстрого поиска по ним.

Это если нужна сама операция поиска по элементам массива (в случае тегов — скорее всего нужна, о чём я намекнул в своём сообщении).

theNamelessOne ★★★★★
()

Я смотрю тут недавно завезли в sqlite кажется списки если не ошибаюсь? Кто в теме поясните пожалуйста, не уверен что правильно понял что там пишут.

В связи с этим вопрос, задача темы получается может быть через них решена более простым образом?

rubro
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.