Организация таблицы с перекрестными ссылками, как?

Модераторы: kdv, CyberMax

Ответить
EvilsInterrupt
Сообщения: 66
Зарегистрирован: 29 авг 2006, 10:00

Организация таблицы с перекрестными ссылками, как?

Сообщение EvilsInterrupt » 01 апр 2007, 11:15

День добрый!

Возникла такая ситуация, когда мне надо книгу от нести по 2 или более тематикам, к примеру книга "Внутреннее устройство Windows" от М.Руссиновича может быть отнесена к тематикам: "Разработка драйверов", "Операционные системы", "Администрирования" и еще бог весть куда, куда пользователь захотел.
Но поиск по ключевому слову "перекрестные" не на форуме, не на сайте ничего не выдал, а поиск в ya.ru такое выдал, что мне ребенку с неокрепшим мозгом такое читать вредно ;)

Подскажите как можно организовать перекрестные ссылки или лучше, дайте ссыль на статью.

Удачи вам

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Re: Организация таблицы с перекрестными ссылками, как?

Сообщение avenger » 01 апр 2007, 12:38

EvilsInterrupt писал(а):Возникла такая ситуация, когда мне надо книгу от нести по 2 или более тематикам, к примеру книга "Внутреннее устройство Windows" от М.Руссиновича может быть отнесена к тематикам: "Разработка драйверов", "Операционные системы", "Администрирования" и еще бог весть куда, куда пользователь захотел.
Ну так и в чем проблема? Это обычная связь многие-к-многим. Делается через промежуточную таблицу.
Books(ID: Integer); Tematiks(ID: Integer)

Таблица связей:

Код: Выделить всё

СвязьКнигСТематиками(
  BookFK: Integer,
  TematikFK: Integer,
  ...
)

PrimaryKey=(BookFK, TematikFK)
ForeignKey1=(BookFK на таблицу Books)
ForeignKey2=(TematikFK на таблицу Tematiks)

EvilsInterrupt
Сообщения: 66
Зарегистрирован: 29 авг 2006, 10:00

Сообщение EvilsInterrupt » 01 апр 2007, 13:30

Получается не много-ко-много, а один-ко-много. Т.к. одна книга и много тематик.

вот у мну есть:

Код: Выделить всё

CREATE TABLE EBook (
       ID Integer NOT NULL,
       Name Varchar(50) NOT NULL,
...
и:

Код: Выделить всё

CREATE TABLE Subject (
       ID Integer NOT NULL,
       Parrent_FK Integer NOT NULL,
       Value_ Varchar(15) NOT NULL,
       CONSTRAINT PK_Subject PRIMARY KEY (ID)
);

ALTER TABLE Subject ADD CONSTRAINT Subject_FK FOREIGN KEY (Parrent_FK) REFERENCES Subject(ID) ON UPDATE CASCADE ON DELETE CASCADE;
Это дерево очень хочется оставить, так пользователю проще ориентироваться будет. Но также не обходимо связать книгу с различными видами тематик.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 01 апр 2007, 13:42

EvilsInterrupt писал(а):Получается не много-ко-много, а один-ко-много. Т.к. одна книга и много тематик.

Это дерево очень хочется оставить, так пользователю проще ориентироваться будет. Но также не обходимо связать книгу с различными видами тематик.
В любом случае, делай через промежуточную таблицу. Структуру привел выше постом.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 01 апр 2007, 13:56

EvilsInterrupt писал(а):Получается не много-ко-много, а один-ко-много. Т.к. одна книга и много тематик.
Один-ко-многим - это частный случай случай много-ко-многим :wink:.
Так что тебе правильно сказали.

EvilsInterrupt
Сообщения: 66
Зарегистрирован: 29 авг 2006, 10:00

Сообщение EvilsInterrupt » 01 апр 2007, 22:39

Придется ждать полнолуния, мозг отказывается думать. :(

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 02 апр 2007, 01:06

EvilsInterrupt писал(а):Получается не много-ко-много, а один-ко-много. Т.к. одна книга и много тематик.
И каждой тематике соответствует множество книг
EvilsInterrupt писал(а):Это дерево очень хочется оставить, так пользователю проще ориентироваться будет. Но также не обходимо связать книгу с различными видами тематик.
В чём проблемы ?
Связь M:N между книгами и тематиками никаким образом не касается внутреннее устройство тематик (дерево, куст, окоп и т.п.) - главное чтобы было на что ссылаться (PK)

EvilsInterrupt
Сообщения: 66
Зарегистрирован: 29 авг 2006, 10:00

Сообщение EvilsInterrupt » 02 апр 2007, 08:05

Вчера фаза луны была подходящей и в аську вышел очень хороший человек и дал пинка в нужном направлении. Спасибо тем, кто дал мне понимание этой техники!

Проблема решана

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 02 апр 2007, 10:44

А Parrent - это, очевидно, смесь между parent и parrot ? :)

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 02 апр 2007, 11:04

Нет, это Parrent -> Par Rent -> Parent Rent (а может Param Rent) :lol:

Ответить