LINUX.ORG.RU

История изменений

Исправление MOPKOBKA, (текущая версия) :

Зачем так много таблиц? Нужно завести одну таблицу, назову ее t_entity

ID INTEGER AUTO_INCREMENT,
ENTITY TEXT,
NAME TEXT,
LINK_SRC INTEGER,
LINK_DST INTEGER
ENTITY это тип записи.

Теперь можно создавать группы и альбомы, создаешь исполнителя AC/DC, просто вставляя строку с такими значениями столбцов (неуказанные пусть будут NULL)

ID=1
ENTITY=artist
NAME=AC/DC

Создаешь альбом Highway to Hell

ID=2
ENTITY=album
NAME=Highway to Hell

Даешь альбому авторство AC/DC

ID=3
ENTITY=link_author
NAME=Исполнитель
LINK_SRC=2
LINK_DST=1

А теперь можно теперь создать не только дополнительных авторов, но и студию

ID=4
ENTITY=studio
NAME=Roundhouse

И привязать ее к альбому

ID=5
ENTITY=link_author
NAME=Студия
LINK_SRC=2
LINK_DST=4

И даже не пришлось менять структуру таблицы, а ведь такое ты явно заранее не продумал, да?

Выбрать все альбомы группы AC/DC можно так

SELECT t_entity.* FROM t_entity
INNER JOIN t_entity t_entity_link_author 
  ON t_entity.ENTITY = "album"
  AND t_entity_link_author.ENTITY = "link_author"
  AND t_entity.ID = t_entity_link_author.LINK_SRC
  AND t_entity_link_author.LINK_DST=1;
Единица в LINK_DST=1 это ID группы AC/DC, логика запроса такая что мы выбираем все альбомы, у которых есть связь с нужным link_author.

Исправление MOPKOBKA, :

Нужно завести одну таблицу, назову ее t_entity

ID INTEGER AUTO_INCREMENT,
ENTITY TEXT,
NAME TEXT,
LINK_SRC INTEGER,
LINK_DST INTEGER
ENTITY это тип записи.

Теперь можно создавать группы и альбомы, создаешь исполнителя AC/DC, просто вставляя строку с такими значениями столбцов (неуказанные пусть будут NULL)

ID=1
ENTITY=artist
NAME=AC/DC

Создаешь альбом Highway to Hell

ID=2
ENTITY=album
NAME=Highway to Hell

Даешь альбому авторство AC/DC

ID=3
ENTITY=link_author
NAME=Исполнитель
LINK_SRC=2
LINK_DST=1

А теперь можно теперь создать не только дополнительных авторов, но и студию

ID=4
ENTITY=studio
NAME=Roundhouse

И привязать ее к альбому

ID=5
ENTITY=link_author
NAME=Студия
LINK_SRC=2
LINK_DST=4

И даже не пришлось менять структуру таблицы, а ведь такое ты явно заранее не продумал, да?

Выбрать все альбомы группы AC/DC можно так

SELECT t_entity.* FROM t_entity
INNER JOIN t_entity t_entity_link_author 
  ON t_entity.ENTITY = "album"
  AND t_entity_link_author.ENTITY = "link_author"
  AND t_entity.ID = t_entity_link_author.LINK_SRC
  AND t_entity_link_author.LINK_DST=1;
Единица в LINK_DST=1 это ID группы AC/DC, логика запроса такая что мы выбираем все альбомы, у которых есть связь с нужным link_author.

Исходная версия MOPKOBKA, :

Нужно завести одну таблицу, назову ее t_entity

ID INTEGER AUTO_INCREMENT,
ENTITY TEXT,
NAME TEXT,
LINK_SRC INTEGER,
LINK_DST INTEGER
ENTITY это тип записи.

Теперь можно создавать группы и альбомы, создаешь исполнителя AC/DC

ID=1
ENTITY=artist
NAME=AC/DC

Создаешь альбом Highway to Hell

ID=2
ENTITY=album
NAME=Highway to Hell

Даешь альбому авторство AC/DC

ID=3
ENTITY=link_author
NAME=Исполнитель
LINK_SRC=2
LINK_DST=1

А теперь можно теперь создать не только дополнительных авторов, но и студию

ID=4
ENTITY=studio
NAME=Roundhouse

И привязать ее к альбому

ID=5
ENTITY=link_author
NAME=Студия
LINK_SRC=2
LINK_DST=4

Выбрать все альбомы группы AC/DC можно так

SELECT t_entity.* FROM t_entity
INNER JOIN t_entity t_entity_link_author 
  ON t_entity.ENTITY = "album"
  AND t_entity_link_author.ENTITY = "link_author"
  AND t_entity.ID = t_entity_link_author.LINK_SRC
  AND t_entity_link_author.LINK_DST=1;
Единица в LINK_DST=1 это ID группы AC/DC, логика запроса такая что мы выбираем все альбомы, у которых есть связь с нужным link_author.