|
|
|
Две взаминоссылающиеся таблицы - так можно ?
|
|||
|---|---|---|---|
|
#18+
Здравсвуйте. Такая штука - есть таблица "Воркфлы" (ид, название) есть таблица "Состояния воркфлы" (ид, ид_воркфлы, название_состояния) Например: "Воркфлы"(1,'Счет') "Воркфлы"(2,'Продажа') "Состояния воркфлы" (1, 1, 'Сформирован') "Состояния воркфлы" (2, 1, 'Проверен') "Состояния воркфлы" (3, 1, 'Утвержден') "Состояния воркфлы" (4, 1, 'Отменен') Согласно теории автоматов, у воркфлы должно быть определено начальное состояние системы. И тут есть два варианта: 1) в таблицу состояний ввести булеву колонку "Начальное_Состояние". Тогда станет: "Состояния воркфлы" (1, 1, 1, 'Сформирован') "Состояния воркфлы" (2, 1, 0, 'Проверен') "Состояния воркфлы" (3, 1, 0, 'Утвержден') "Состояния воркфлы" (4, 1, 0, 'Отменен') Получается что будет выставлен только у одного элеменат из множества, у остальных он будет сброшен. 2) В таблицу "Воркфлы" добавить ссылку на начальное состояние: "Воркфлы"(1,'Счет', 1) - где 1, это референс на "Состояния воркфлы" с ид=1 Тут получается что две таблицы ссылаются друг на друга. Не уверен, что так делать правильно. Что посоветуете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2011, 21:03 |
|
||
|
Две взаминоссылающиеся таблицы - так можно ?
|
|||
|---|---|---|---|
|
#18+
Не уверен, что "въехал" в вопрос, но... Мне как-то было бы понятнее, если была бы табличка объектов (ваши "Воркфлы"), табличка состояний (ид, название состояния) и табличка связей (ид воркфлы, ид состояния). Тогда получается, что установив связь между "воркфлы" и "состояния" Вы задаете соответствующее состояние. А начальное состояние задаете установив начальные связи... А вот если нужно запомнить именно начальное состояние (вы ж не пояснили, что вам конкретно нужно), то можно булевое поле внести в таблицу связей. А если следить за сменой состояний во времени, то нужно в таблицу связей внести datetime... В общем, если что не так понял - не судите строго, а попробуйте лучше объяснить ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2011, 00:04 |
|
||
|
Две взаминоссылающиеся таблицы - так можно ?
|
|||
|---|---|---|---|
|
#18+
Объясняю: К документу нужно присобачить состояния - проведен, отменен, утвержден и прочее. Таких воркфлоу несколько - своя для документа "счет", своя для документа "продажи" как я делаю: Делаю таблицу "Воркфлы" - тут воркфлы какие в принципе могут быть "Состояния воркфлы" - тут состоятния в какие может переходить воркфла из таблицы "Воркфлы" Есть еще таблица "Переходы" вида (ид, ид_состояния_из_которого_переходим, ид_состояния_в_которое_переходим) Берем например воркфлу 'Счет'. Доступные состояния: 'Сформирован', 'Проверен', 'Утвержден', 'Отменен' И соответственно переходы: 'Сформирован' -> 'Проверен' 'Проверен' -> 'Утвержден' 'Проверен' -> 'Отменен' 'Проверен' -> 'Сформирован' Воркфла должна начинаться с состояния 'Сформирован'. Неявно я не могу его вывести, поскольку есть переход 'Проверен' -> 'Сформирован' который закольцовывает воркфлу. Чтобы понимать откуда начинать движение я должен пометить как то какое состояние вокфлы является начальным. Сделать я это могу введя в таблицу "Состояния воркфлы" булево поле которое покажет откуда начинать движение или в таблице "Воркфлы" сделать ссылку на "Состояния воркфлы" с начальным состоянием - тогда получится что две таблицы ссылаются друг неа друга ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2011, 07:44 |
|
||
|
Две взаминоссылающиеся таблицы - так можно ?
|
|||
|---|---|---|---|
|
#18+
Не важноЧтобы понимать откуда начинать движение я должен пометить как то какое состояние вокфлы является начальным. Сделать я это могу введя в таблицу "Состояния воркфлы" булево поле которое покажет откуда начинать движение или в таблице "Воркфлы" сделать ссылку на "Состояния воркфлы" с начальным состоянием - тогда получится что две таблицы ссылаются друг неа друга можешь сделать числовое поле "Порядок обхода" в таблице "Состояния воркфлы" начальное состояние - минимальное значение поля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2011, 08:00 |
|
||
|
Две взаминоссылающиеся таблицы - так можно ?
|
|||
|---|---|---|---|
|
#18+
On 10.02.2011 21:03, Не важно wrote: Так можно. Только одно из полей должно быть NULL, иначе создать две такие записи можно только в СУБД, где есть отложенная проверка FK в конце транзакции. Таких СУБД очень мало, кажется, так делает только Оракл, и то я не уверен. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2011, 10:40 |
|
||
|
Две взаминоссылающиеся таблицы - так можно ?
|
|||
|---|---|---|---|
|
#18+
Не важноЗдравсвуйте. ... Тут получается что две таблицы ссылаются друг на друга. Не уверен, что так делать правильно. Что посоветуете? Переводя Ваш вопрос на язык баз данных: "Тут получается, что между двумя объектами есть две разных связи. Не уверен, что это может быть" Странная неуверенность:) Разумеется между двумя объектами может быть более одной связи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2011, 20:12 |
|
||
|
Две взаминоссылающиеся таблицы - так можно ?
|
|||
|---|---|---|---|
|
#18+
Не важноТут получается что две таблицы ссылаются друг на друга. Не уверен, что так делать правильно.А что уж говорить о таблицах, которые ссылаются сами на себя ? Вообще, ужас :) В принципе, чисто технически оба варианта вполне приемлемы. Только в первом варианте в таблице состояний логическое поле "Начальное_Состояние" излишне. Достаточно минимальное(первое) значение поля "ид" в таблице "Состояния воркфлы" считать за начальное. Во 2-ом варианте ссылка на первый элемент в таблице "Воркфлы" должна разрешать ввод NULL, о чем уже сказал MasterZiv. Есть ещё и 3 вариант. Добавить ещё одну таблицу связи "Начальное_Состояние_Воркфлы" в которой будут поля (Воркфлы_ид, Состояния воркфлы_ид). Но с другой стороны, это всё чисто вопросы реализации. Другой, более важный, вопрос, насколько корректна модель, которую Вы пытаетесь реализовать ? В общем случае состояния документов это не обязательно последовательность, а вполне себе граф, даже с циклами и с дополнительными условиями на очередной переход. К примеру, документ не может быть отклонён и отправлен на доработку более 2 раз, а на 3-й раз уходит на отказ. IMHO, есть повод подумать ещё раз над постановкой задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2011, 05:46 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37112403&tid=1542317]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
178ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 241ms |
| total: | 521ms |

| 0 / 0 |
