Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен совет по правильной организации данных 
:(
    Опции темы
CyraxZ
Дата 28.6.2012, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Здравствуйте. Нужен совет касательно оптимальной структуры БД.
Задача следующая (описываю без привязки к конкретной СУБД, названия пишу по-русски, чтобы было понятно):

Имеются таблицы:
Организация
id
id юридического адреса
id фактического адреса
id почтового адреса

...

Объект (примечание: это любой магазин, здание, офис, принадлежащий некоторой организации и указываемый в телефонном справочнике отдельной строкой)
id
id адреса
...

Отдел (примечание: каждый объект может иметь несколько отделов, причём отдел может находиться по другому адресу, нежели сам объект - бывает и такое)
id
id адреса
...

Адрес
id
тип
Улица
№ дома
...

Здесь возможны 2 варианта связей между организациями/объектами/отделами и адресами:
1. Каждая организация, объект и отдел имеют поле с идентификатором адреса.
2. Организации, объекты и отделы идентификаторов адресов не имеют, а таблица с адресами содержит поля с идентификаторами организации, объекта и отдела, которые расположены по данному адресу:
Адрес
id
id организации
id объекта
id отдела
Улица
№ дома
...

Какой из данных вариантов является более правильным ?
Полагаем, что:
1. Даже если 2 организации или объекта расположены по одному адресу, то в таблице Адрес для них выделяются разные строки.
2. Во 2-м варианте реализации для каждой записи может быть заполнено только одно из полей: "id организации", "id объекта", либо "id отдела".

Это сообщение отредактировал(а) CyraxZ - 2.7.2012, 10:00
PM MAIL   Вверх
Zloxa
Дата 28.6.2012, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(CyraxZ @  28.6.2012,  16:12 Найти цитируемый пост)
Полагаем, что даже если 2 организации или объекта расположены по одному адресу, то в таблице Адрес для них выделяются разные строки. 

Это предположение низводит на нет и без того спорный профит от выделения адресов в отдельную сущность.

Это сообщение отредактировал(а) Zloxa - 28.6.2012, 15:24


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
CyraxZ
Дата 28.6.2012, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Цитата

Это предположение низводит на нет и без того спорный профит от нормализации адресов.

Дело в том, что таблица Адрес, помимо собственно адресных полей (улица, дом, корпус и т.п.) имеет ещё комментарии для справочника - комментарий к улице, комментарий к номеру дома, комментарий к офису. Вот эти комментарии в большинстве случаев как раз и будут различны даже в том случае, если организации/объекты расположены по одному адресу.
Не хотел усложнять структуру...

Zloxa, так какой Ваш вариант ?

Это сообщение отредактировал(а) CyraxZ - 28.6.2012, 15:28
PM MAIL   Вверх
Zloxa
Дата 28.6.2012, 15:30 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



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

Например в каких либо геосервисах, вроде гуглмапс, выделение его как сущности имеет смысл. По адресу предполагается поиск организаций, расположенных в непосредственной близости к нему. Адрес может жить и сам по себе, без привязки объектов к нему.

Если же адреса не являются самостоятельной сущностью, нафига ее выделять?

Добавлено @ 15:33
Цитата(CyraxZ @  28.6.2012,  16:27 Найти цитируемый пост)
Zloxa, так какой Ваш вариант ?

Так то вобще мне пофигу. Задача стоит не передо мной, отвечать не мне.
Цитата(CyraxZ @  28.6.2012,  16:27 Найти цитируемый пост)
 Вот эти комментарии в большинстве случаев как раз и будут различны даже в том случае, если организации/объекты расположены по одному адресу.

Ну так и привязывайте коментарий к тому объекту, который подлежит коментированию.

Это сообщение отредактировал(а) Zloxa - 28.6.2012, 15:35


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
CyraxZ
Дата 28.6.2012, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Цитата

Если же адреса не являются самостоятельной сущности, нафига ее выделять?

Но если этого не сделать, то в таблицах "Организация", "Объект", "Отдел" придётся дублировать по 20 записей (именно столько записей у меня сейчас в таблице "Адрес", включая номер копуса, владение, номер офиса, подъезд, этаж, идентификатор ближайшей остановки, идентификатор микрорайона + комментарии ко многим полям).
Ну а такое масштабное дублирование, имхо, недопустимо.

Добавлено @ 15:47
Цитата

Ну так и привязывайте коментарий к тому объекту, который подлежит коментированию.

Здесь опять придётся в таблицах "Организация", "Объект", "Отдел" дублировать 3 поля-комментария: к расположению здания, к расположению офиса внутри здания и общий комментарий к адресу.
Дополнительно придётся дублировать поля-статусы (для многих полей в таблицах предусмотрены состояния актуальности данных: "Не проверено", "Проверено", "Уточнить". Т.е. для поля с номером дома в таблице "Адрес" имеется поле состояния номера дома - то же самое для улицы, номера офиса и др. полей. И все эти поля-состояния будут различны даже для тех организаций, которые расположены по одному адресу). 
В итоге в таблицах "Организация", "Объект", "Отдел" придётся дублировать 3 поля-комментария и с десяток полей-состояний.

Это сообщение отредактировал(а) CyraxZ - 28.6.2012, 15:54
PM MAIL   Вверх
Zloxa
Дата 28.6.2012, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(CyraxZ @  28.6.2012,  16:35 Найти цитируемый пост)
Ну а такое масштабное дублирование, имхо, недопустимо. 

Т.е. дублировать в строках- нормально. В столбцах - плохо?  smile 
Цитата(CyraxZ @  28.6.2012,  16:35 Найти цитируемый пост)
20 записей

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

В википедии был хорший пример понятия атомарность. Так и увас, подумайте, если поменять местами номер офиса и подъезд, станут ли адреса разными?

Добавлено через 10 минут и 24 секунды
Цитата(Zloxa @  28.6.2012,  16:56 Найти цитируемый пост)
В википедии был хорший пример понятия атомарность. Так и увас, подумайте, если поменять местами номер офиса и подъезд, станут ли адреса разными?

Вобще, да... это тезис к разбиению  smile

Добавлено через 13 минут и 36 секунд
Цитата(CyraxZ @  28.6.2012,  16:35 Найти цитируемый пост)
Добавлено @ 16:47

Я совершенно запутался и не могу осилить. Вы сейчас рассуждаете о понятиях "коментарий", "статус", "состояние", которые не имеют никакого отношения к понятию "адрес". smile

Это сообщение отредактировал(а) Zloxa - 28.6.2012, 15:56


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 28.6.2012, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(Zloxa @  28.6.2012,  16:56 Найти цитируемый пост)
Вобще, да... это тезис к разбиению 

Вобще нет. Определение атормарности позволяет ответить на вопрос может ли атрибут быть разделен, но не следует ли это делать.

Мой хороший знакомый в таких случаях любит говорить, мол "я могу насрать посередине офиса, это же не значит что мне это следует это делать"  smile  


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
CyraxZ
Дата 28.6.2012, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Цитата

Вам действительно нужно именно 20 полей?

Да, все 20. Комментарии и статусы нужны для справочника.

Цитата

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

Будет:
1. В режиме сортировки "По адресам" слева на форме у меня будет построено дерево объектов, сгруппированных по адресам:
Город 1
- улица 1
-- дом №3
--- объект 1
--- объект 2
--- объект 3
-- дом №3 к.1
--- объект 4
- улица 2
...
Здесь необходимо будет осуществлять поиск/отбор по конкретным полям, состявляющих адрес.

2. Становится возможным контроль данных:
- улица должна быть введена только та, что имеется в справочнике улиц (справочник улиц формируется заранее)
- номера домов, корпусов, владений, офисов, подъездов должны иметь числовой тип данных и лежать в определённом диапазоне

3. Разделение адреса на отдельные поля даёт возможность помечать флагами "Не проверено", "Проверено", "Уточнить" отдельные фрагменты адреса. Например, улица известна (имеет статус "Проверено"), а номер дома требует уточнения (имеет статус "Уточнить"). Без разделения такую информацию в БД хранить не будет возможности.

Цитата

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

Ну как же не имеют ?
Комментарии идут к фрагментам адреса: один комментарий к фрагменту "улица-дом-корпус", другой - к фрагменту "этаж, офис". Третий - альтернативная локализация объекта (например, в "3 километрах к северу от такого-то лесничества" - для объектов с отстутсвующим/неизвестным адресом).
Поля-статусы как раз и позволяют отметить флагом фрагменты адреса, которые следут уточнить (неизвестным может быть не весь адрес, а только номер дома или номер офиса и т.д.).

Это сообщение отредактировал(а) CyraxZ - 28.6.2012, 18:04
PM MAIL   Вверх
CyraxZ
Дата 28.6.2012, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Вернёмся к сабжевому вопросу.

Если реализовать 1-й вариант (сущности "Организация", "Объект" и "Отдел" имеют поле "id адреса"), то установка правила CASCADE DELETE приведёт к тому, что при удалении адреса будут удалены все организации, расположенные по этому адресу. Этого допустить нельзя. Ну а правило, по которому при удалении организации/объекта/отдела будут удаляться их адреса, на уровне СУБД реализовать не получится (триггеры не в счёт, так как в Access их нет).

Если реализовать 2-й вариант (сущность "Адрес" имеет поля "id организации", "id объекта" и "id отдела"), то установка правила CASCADE DELETE приведёт к тому, что при удалении организации/объекта/отдела соответствующие адреса будут удалены автоматически - это то, что нужно.
Собственно, по этой причине я пока и остановился на втором варианте.

Это сообщение отредактировал(а) CyraxZ - 28.6.2012, 20:17
PM MAIL   Вверх
Zloxa
Дата 28.6.2012, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(CyraxZ @  28.6.2012,  21:16 Найти цитируемый пост)
то установка правила CASCADE DELETE приведёт к тому, что при удалении адреса будут удалены все организации, расположенные по этому адресу. Этого допустить нельзя.

каскадные операции - зло smile

Цитата(CyraxZ @  28.6.2012,  21:16 Найти цитируемый пост)
будут удалены автоматически - это то, что нужно.

каскадные операции - зло smile


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
CyraxZ
Дата 29.6.2012, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Цитата

каскадные операции - зло

Почему ?
PM MAIL   Вверх
Zloxa
Дата 29.6.2012, 09:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(CyraxZ @ 29.6.2012,  10:11)
Цитата

каскадные операции - зло

Почему ?

На этапе разработки, они создают ощущение облегчения жизни.

В процессе же эксплуатации, при модернизации они постоянно приводят к вопросу "куда делись мои данные".

В процессе эксплуатации любой системы достаточно регулярно возникают ситуации, которые требуют выполнения операций, не предусмотренных на этапе разработки. Как правило такие ситуации имеют разовый характер, допиливать функционал ради разовой заливки/перезаливки/конверсии обычно не целессобразно, потому эти операции производятся вручную, с использованием подручных средств, и, достаточно редко действительно имеется возможность потренироваться на кошечках где-то сбоку. При таких операциях, возникновение исключения в случае нарушения целостности - великое благо для разработчика. Для него это сигнал что он что-то делает не так, что -то не учел. Если ему нужно не согласующиеся данные удалить, ему не составит труда написать лишний делитик. А вот в случае, если не предполагает рассоглосвания данных, или же данные, входящие в конфликт представляют какую-то ценность, каскадный делит ему окажет очень злую услугу.

То же самое и при развитии системы. Допустим, через три - пять лет успешной эксплуатации написанной тобой системы, тебе потребовалось ее дорабоать. В уме каскадные делиты ты уже не держишь. С успехом тестишся на тестовом окружении, а при переезде на прод встаешь перед вопросом "куда делись мои данные".

Эксепшн при нарушении целостности кажется помехой  лишь на этапе первоначальной разработки. При тестировании, доработке и в эксплуатации это великое благо, поверь. smile


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
CyraxZ
Дата 29.6.2012, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Zloxa, это общепринятое мнение ?
Т.е. другие специалисты с Вами согласны ?

Это сообщение отредактировал(а) CyraxZ - 29.6.2012, 10:46
PM MAIL   Вверх
Zloxa
Дата 29.6.2012, 10:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 11
Всего: 161



Цитата(CyraxZ @  29.6.2012,  11:40 Найти цитируемый пост)
Т.е. другие специалисты с Вами согласны ?

Те, кому я помогал объяснить куда делись их данные, определенно - согласны  smile 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
CyraxZ
Дата 29.6.2012, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Т.е. предлагаете для всех связей:
а) оставить включенной опцию обеспечения ссылочной целостности
б) убрать правила каскадного удаления
в) оставить правила каскадного обновления
Так ?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0846 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.