Автор Тема: (SQL) self referencing  (Прочетена 258 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

liumbiwe

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 5
(SQL) self referencing
« -: 27 Юни 2016, 12:29:58 »
Здравейте ,
та ... имам една себе-сочеща таблица и целта ми е на всеки нов запис определена колона да има default стойност равна на id-то от същия запис.

пример:
id: 55 | column: value | column: value .... | parent_id: 55

Правя система за интервюта , и целта е всеки кандидат да има n на брой интервюта и всяко следващо е child на предходното. Проблема е че първото няма предходно и трябва да сочи към себе си , а не мога да измисля удачен вариант да стане.
Благодарности.

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: (SQL) self referencing
« Отговор #1 -: 27 Юни 2016, 16:49:23 »
Това се нарича Linked List (свързан списък?), а това което те мъчи се нарича опашка на списъка и сочи към NULL.
Общо взето изглежда така работата.

1. Създаваш първи елемент, който  при тебе е опашката на списъка и тъй като няма други елементи се пада и глава на списъка.

 
head -->  +-------+  <-- tail
                | id  = 0 |
                +-------+
                | parent |-->NULL
                +-------+

2. Добавяш първото дете, което сочи към главата на списъка и след като се добави се превръща само в глава на списъка

head --> +-------+           +-------+  <--- tail
               | id  = 9 |    +-> | id = 0 |
               +-------+    |     +-------+
               | parent |-- +     | parent |-->NULL
               +-------+           +-------+

3. Добавяш второ дете, което се превръща в глава на списъка и сочи към моментната глава.

head --> +-------+           +-------+          +-------+  <--- tail
               | id = 12|    +-> | id  = 9 |   +-> | id = 0 |
               +-------+    |     +-------+    |     +-------+
               | parent |-- +     | parent |--+     | parent |-->NULL
               +-------+           +-------+          +-------+


и тнт.


Не съм сигурен, че това е най-удачното решение на проблема ти, но това което описваш е точно списък.
Ако решиш да го имплементираш така ще трябва да мислиш за специалните случаи, както например когато искаш да изтриеш елемент вътре в списъка.
В примера горе това ще е елемент с id=9. То тогава трябва да смениш FK на елемент с id=12 да сочи към id=0, иначе свързания ти списък става развързан списък ;)
« Последна редакция: 27 Юни 2016, 17:04:34 от kjufte »