|
|
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
Привет Допустим, надо указать адрес какого-то объекта. Отображаем в виде Страна -> город -> улица -> дом -> квартира Можно создать таблицу типа Квартира (Дом_ID, Улица_ID, Город_ID, Страна_ID) где ID ссылаются на соответствующие таблицы с данными о том или ином элементе. А что делать, если надо произвольно сгруппировать какие-либо элементы? Например, cтраны по размещению на континентах, города на северные и южные, областные центры и столицы и т.д. Тогда при произвольном количестве элементов группировки (группа -> город -> или группа -> группа -> город ->) предыдущая таблица не годится. Надо создать таблицу вида Tree (ID, Элемент_ID, Таблица, parent_ID) Здесь parent_ID ссылается на ID. Элемент_ID ссылается на таблицу, указанную в поле "Таблица" (признак группировки никуда не ссылается - он не несёт никакой информации кроме как признака). Вопрос в следующем: как в таком случае обеспечить целостность БД? Ведь Элемент_ID ссылается не одновременно на три разных таблицы. Может есть ещё какой-то способ это реализовать? Пока что идея использовать сразу две вышеприведённые таблицы + триггеры для вставки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2006, 03:14 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
Есть ощущение, что происходит путаница между уровнем модели БД и уровнем визуального представления в приложении. Вы вроде как хотите, чтобы структура БД каким-то образом полностью соответствовала интерфейсу программы. Обычно это тупиковый путь. Вы главное правильно БД спроектируйте, а как данные отображать -- дело техники: хошь такое дерево, хошь такой список... С точки зрения проектирования БД не ясны ваши проблемы. Задача вроде не очень трудная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2006, 12:12 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
автор Квартира (Дом_ID, Улица_ID, Город_ID, Страна_ID) Для начала хорошо бы определиться с методом хранения адресной информации. Или Квартира (Кв_ID, Дом_ID) Дом (Дом_ID,Улица_ID) ... или АдресныйОбъект (Адр_объект_ID,тип, входит_в_ID) Группировка же ортогональна адресам. Например для второго варианта Входит_в_Группу (Адр_объект_ID, Группа_ID). Что из себя представляют группы также вопрос отдельный. Посмотрите на КЛАДР. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2006, 13:24 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
Ну смотрите. Возьмём к примеру файловую систему. Есть файлы, есть приложения, которыми эти файлы открываются. Соответственно есть таблицы с файлами, есть разные таблицы с приложениями. Надо сделать так, чтобы не возможно было удалить приложение, пока есть для него файлы. Грубо говоря запись из этой категории файлов ссылается на таблицу с соответ. приложением. Файлы с одним расширением я могу сгруппировать в одну папку. Эту папку могу вложить ещё в одну папку. А могу и не вкладывать, т.е. чёткой глубины вложенности нет (как вариант, можно ограничить уровень вложенности от 0 до 2-х - тогда задача в корне упростится). Вопрос в том, как в базе данных сохранить путь от элемента высшего (первого) уровня к низшему (третьего) при наличии таких вот папок? Обеспечив при этом ещё и целостность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2006, 16:24 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
Ээ... так адреса или папки? Приложения связаны с файлами или типами файлов? Собственно аккуратное перечисление сущностей и связей это уже почти ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2006, 18:22 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
И адреса, и папки. Вопрос в том, как обеспечить ссылочную целостность. Вот если бы из всех таблиц сделать одну со сквозной нумерацией. Но тогда Города и улицы и дома свалятся в одну кучу. Чего делать не надо. Пока только один вариант - из первого поста. НО. Избыточность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2006, 18:55 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
Ну вообщем, пикча. Сверху - это то, что есть сейчас, снизу - должна быть такая возможность. При этом элементы Северные и Южные районы, Чётная сторона для выбора пользователю не доступны (признак группировки элементов одного уровня). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2006, 19:21 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
Структура базы и визуальный интерфейс единственно не должны друг другу противоречить. А вычислить одно по другому сложновато будет. Дерево для отображения может строится запросом как из одной так и нескольких таблиц. Добавление/изменени узла также может затрагивать одну или несколько или разные таблицы в БД. Опишите сущности и их отношения что называется по жизни. Например, может /обязана улица входить в несколько / только одну группу. Или же в группу входят совсем не улицы а дома. (Улица пересекает несколько районов). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2006, 19:55 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
В группе, конечно, не один элемент, а несколько. И город, и улица, и дом - всё должно иметь возможность быть сгруппировано по определённому признаку (чтобы пользователь мог как можно быстрее добраться до нужного дома).Но, к примеру, в городе может быть всего одна улица, которая нас интересует. Для неё вводить группу бессмысленно. Вот если бы в FK можно было задать три таблицы на выбор - вопроса вообще б не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2006, 20:43 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
parovoZZВот если бы в FK можно было задать три таблицы на выбор - вопроса вообще б не было. http://www.sql.ru/forum/actualthread.aspx?tid=294893#2679780Здесь, но вопрос в другом, так возможно? -Город --Районы по географии ---Северные ----Улица1 ---Южные ----Улица1 --Районы по роли ---Спальные ----Улица1 ---Деловые ----Улица1 --Улицы по типу ---Проспект ... ---Улица ----Улица1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2006, 10:15 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
НЕ, есть три таблицы Города Улицы Дома Всё. Соответственно -Город --Улица1 --Улица2 --Улица3 .... Такого быть не должно, иначе будет путаница -Город --Улица1 --Улица1 ..... Только так -Город --Улица1 --Улица2 -Город --Улица1 --Улица3 ... Как пользователь будет это группировать - никому не известно. Как ему удобнее. Главное, что группировка несёт ТОЛЬКО визуальную нагрузку. К примеру, на вокзале есть два павильона - Отправление и Прибытие. Нумерация помещений не сквозная. Можно так -Вокзал[Отправление] --пом 101 --пом 210 --Зал ожидания -Вокзал[Прибытие] --Зал ожидания ... Но лучше так -Вокзал --Прибытие ---Зал ожидания --Отправление ---пом 101 ---Зал ожидания ... Для этого есть таблица Дерево (ID , Элемент_ID , Имя_таблицы, parent_ID); Имя таблицы - это та таблица, на которую ссылается Элемент_ID. Так как таблиц много, FK не поможет. Только на триггерах. А хотелось бы на физическом уровне. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2006, 19:38 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
parovoZZПривет Допустим, надо указать адрес какого-то объекта. Отображаем в виде Страна -> город -> улица -> дом -> квартира Можно создать таблицу типа Квартира (Дом_ID, Улица_ID, Город_ID, Страна_ID) где ID ссылаются на соответствующие таблицы с данными о том или ином элементе. А что делать, если надо произвольно сгруппировать какие-либо элементы? Например, cтраны по размещению на континентах, города на северные и южные, областные центры и столицы и т.д. Тогда при произвольном количестве элементов группировки (группа -> город -> или группа -> группа -> город ->) предыдущая таблица не годится. Надо создать таблицу вида Tree (ID, Элемент_ID, Таблица, parent_ID) Здесь parent_ID ссылается на ID. Элемент_ID ссылается на таблицу, указанную в поле "Таблица" (признак группировки никуда не ссылается - он не несёт никакой информации кроме как признака). Вопрос в следующем: как в таком случае обеспечить целостность БД? Ведь Элемент_ID ссылается не одновременно на три разных таблицы. Может есть ещё какой-то способ это реализовать? Пока что идея использовать сразу две вышеприведённые таблицы + триггеры для вставки. Вы ушли от главного принципа реляционных моделей, нормализации. Поэтому возникли проблемы, с избыточностью, с целостностью. Для представления древовидной структуры Страна -> город -> улица -> дом -> квартира можно было использовать 4 таблицы. Например: Код: plaintext Надеюсь, если Вы знаете UML, обозначения <>---* понятны. Например, соответственно, таблица "город" будет выглядеть так: Код: plaintext 1. 2. 3. Для группирования городов, стран, улиц, домов также лучше использовать отдельные таблицы. Например, связь город -> район -> улица Код: plaintext На Zigzag все эти деревья реализуются проще. Заранее схему таблиц можно не указывать. Ну и конечно дерево, само по себе поддерживает целостность. Вы не можете удалить верхнюю вершину, не удалив нижнюю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2006, 13:21 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
Читал я про зигзаг. Неоднозначное впечатление. Вообщем, накумекал так. К каждой из 3-х таблиц (дом, улица, город) добавляется ещё одна (tree_*) с деревом группировки. Тогда у таблицы Дом (Улица_ID, Город_ID) добавятся ещё три поля со ссылками на начальный ID группы из этих таблиц. Соответственно в таблице, например, tree_улица поле parent_ID со значением 0 будет означать высший уровень. Что сохраняется. Связи элементов можно отображать в произвольном порядке, при этом признаки группировки элементов будут прежними (Улица -> Город -> Дом), а не привязаны друг к другу. Из таблиц tree_* внешних ключей нет, соответственно никаких забот о сохранении целостности нет. Всё реализовано в таблице Дом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2006, 19:48 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
parovoZZ : Странный у Вас подход и не очень понятный. До этого предлагали использовать имя таблицы в качестве атрибута. Что обычно не принято в РБД-приложениях. Для РБД имена таблиц и атрибутов заранее известны приложениям. Для нашей задачи последнее тоже не подходило, поэтому и использовался Zigzag, где вообще отсутствуют имена таблиц, а имена атрибутов можно получить даже по их значениям. Что Вы сейчас предполагаете задавать в таблице tree_город? Такую зависимость "город -> улица"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 15:25 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
Неправильно выразился, хотя по контексту должно быть понятно. Вместо "До этого предлагали использовать имя таблицы в качестве атрибута" лучше написать "До этого предлагали использовать имена таблиц в качестве значений атрибутов". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 15:34 |
|
||
|
Древовидная структура - панацея?
|
|||
|---|---|---|---|
|
#18+
okdoky parovoZZ : Что Вы сейчас предполагаете задавать в таблице tree_город? Такую зависимость "город -> улица"? В tree_город будет дерево групп. Т.е. группа -> группа -> ... группа -> Город_ID. Группа, у которой parent_ID = 0 будет последней в этом дереве. Дочерним элементом какого узла она будет - прописано в таблице Дом (на что указывает город_ID). И таких таблиц будет 3. И никаких имён таблиц в атрибутах (от чего я хотел так избавиться), только в запросах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2006, 21:39 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34027073&tid=1545005]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
156ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 424ms |

| 0 / 0 |
