LINUX.ORG.RU

sqlite связь типа one to many

 , ,


1

1

Как сабж сделать?

Очень надо чтобы я из одной колонки мог ссылаться не на одну запись (one to one, как это позволяет например foreign key) а на кучу записей.

Я хочу сделать что-то типо системы тегов, чтобы по ним дёргать нужные мне записи.

Зачем так? Надоело постоянно менять структуру базы при изменении софта, хочу её разрушить чтобы стала одноранговой, а не иерархичной, так должно стать гораздо лучше.


One-to-Many - если один объект типа А должен быть связан со множеством объектов типа Б, и при этом каждый объект типа Б связан только с одним объектом типа А, то связь реализуют через поле a_id в таблице Б (при этом в таблице А никаких полей, ссылающихся на Б нет). После этого для любого экземпляра А можно найти все экземпляры Б, которые с ним связаны.

Many-to-Many (скорее всего, тебе нужно именно это) - если объект типа А может ссылаться на множество объектов типа Б, и при этом на каждый объект типа Б может ссылаться множество объектов типа А, то связи реализуют через отдельную промежуточную таблицу с полями (a_id, b_id), в которую добавляют запись для каждой связанной пары А и Б. В таблицах А и Б в таком случае не нужны поля, выражающие эти связи.

ddos3
()

Большое спасибо вам ребята, ответы исчерпывающие, ушёл перепиливать базу

rubro
() автор топика

Очень надо чтобы я из одной колонки мог ссылаться не на одну запись (one to one, как это позволяет например foreign key)

Foreign key по дефолту делает one-to-many, тебе нужно лишь обратить эту связь (т.е. засунуть foreign key в другую таблицу).

SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
sqlite> create table posts (
   ...> id integer primary key autoincrement,
   ...> body text not null
   ...> );
sqlite> create table comments (
   ...> id integer primary key autoincrement,
   ...> body text not null,
   ...> post_id integer not null,
   ...> foreign key(post_id) references posts(id)
   ...> );
sqlite> insert into posts (body) values ('Очень надо чтобы я из одной колонки мог ссылаться не на одну запись (one to one, как это позволяет например foreign key)');
sqlite> select last_insert_rowid();
1
sqlite> insert into comments (body, post_id) values ('ШТООАА', 1), ('В гугле забанили?', 1);
sqlite> select * from comments where post_id = 1;
1|ШТООАА|1
2|В гугле забанили?|1
sqlite> 

Пример выше: есть сообщения (posts), есть комментарии (comments), каждое сообщение может иметь несколько комментариев, комментарий может относиться только к одному сообщению.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Спасибо за детальный пример!

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