LINUX.ORG.RU

Как в базах данных принято делать ссылки внутри таблицы?


0

1

Сразу скажу: опыта программирования для СУБД нет. Только опыт пользователя нескольких БД на FoxPro :)

Нужно сделать базу данных, в которой будет таблица, каждая строка которой будет содержать текст, несколько чисел и ссылки на несколько других строк той же таблицы. Каждая ссылка будет иметь свои характеристики — тоже набор чисел. Число ссылок, в принципе, неограниченно, не исключён вариант, когда одна строка будет ссылаться на четверть строк таблицы.

Вопрос: какую структуру базы принято делать в подобном случае? Создавать для каждой строки таблицу внешних ключей?

Единственное требование к БД — как можно большая скорость чтения и поиска среди записей, на которые ссылается данная.

★★★★★

Сделать у родительской таблицы синтетический ключ ID (например), и в дочерней таблицы ключ Parent.

drakmail ★★★★ ()

Имхо классическое отношение «от многих ко многим». Т.е. ссылки с записи на другие записи будут храниться не в главной таблице, а во вспомогательной, типа LinkTable.

Пример:

CREATE TABLE main_table (
  id serial NOT NULL,
  sometext text,
  someint bigint,
  CONSTRAINT main_table_pkey PRIMARY KEY (id)
);

CREATE TABLE link_table (
  id serial NOT NULL,
  primary_entry bigint NOT NULL,
  linked_entry bigint NOT NULL,
  CONSTRAINT link_table_pkey PRIMARY KEY (id)

| id | primary_entry | linked_entry |
|----+---------------+--------------|
| 23 |           128 |            1 |
|----+---------------+--------------|
| 24 |           128 |         2389 |
|----+---------------+--------------|
| 25 |           128 |        54566 |
|----+---------------+--------------|
| 26 |           129 |          245 |
yoghurt ★★★★★ ()
Ответ на: комментарий от Apple-ch

Ну, по вопросу там на каждую связь ещё своя дополнительная информация есть, которую я в пример включать не стал; не знаю, как там собирается всё устравивать ТС, но мало-ли.

yoghurt ★★★★★ ()
Ответ на: комментарий от Apple-ch

потому что гладиолус.
нужен он там, не обязателен, но сильно упрощает жизнь.

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

как пример - нужно удалить из этой таблицы 10 записей, либо выбранных через какой-нибудь ui, либо предыдущим запросом.
при отсутсвии ключа придется либо делать 10 запросов where primary_entry = ? and linked_entry = ? либо составлять один запрос where ( primary_entry = ? and linked_entry = ? ) or ( primary_entry = ? and linked_entry = ? ) и т.д.
если ключ есть, то пишем один запрос where id in ( ? , ? , ? ) и все.

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

Точно, если есть доп. атрибуты, то получается по факту отдельная сущность. Действительно нужен :)

Apple-ch ★★ ()
Ответ на: комментарий от maloi
where ( primary_entry = ? and linked_entry = ? ) or ( primary_entry = ? and linked_entry = ? )

ничем не отличается от

where id in ( ? , ? , ? )

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

отличается хотя бы тем что второй вариант в некоторых случаях строится автоматически некоторыми средствами для работы с db, если написать where id in ( ? ) и в качестве параметра передать массив, ну и скорость опять же непонятно какая будет в первом случае.

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

> Имхо классическое отношение «от многих ко многим».

Спасибо за ключевую фразу :)

ссылки с записи на другие записи будут храниться не в главной таблице, а во вспомогательной

Понятно. Всего одна таблица, и каждая запись содержит 2 ключа: откуда и куда.

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

> там на каждую связь ещё своя дополнительная информация есть

Именно. Ещё несколько целых чисел.

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