powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужна-ли тут нормализация
18 сообщений из 18, страница 1 из 1
Нужна-ли тут нормализация
    #36827118
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется таблица клиентов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Client_ID
Name
Surname
Current_Address_UnitNo
Current_Address_HouseNo
Current_Address_StreetName
Current_Address_StreetTypeID
Current_Address_City
Current_Address_State
Current_Address_Postcode
Previous_Address_UnitNo
Previous_Address_HouseNo
Previous_Address_StreetName
Previous_Address_StreetTypeID
Previous_Address_City
Previous_Address_State
Previous_Address_Postcode
имеются также другие подобные столбцы, например телефон (area + number) и другие.

Нарушена 3-я нормальная форма, вопрос такой - какие именно аномалии мы уберем, если вынесем подобные сущности в другие таблицы? Ведь по-сути тут связь один к одному.
Проблемы типа ошибок в названии города не важны, т.к. каталога городов, названий улиц и т.п. нет (есть только каталог существуюших типов улиц и тип улицы на него и ссылается)
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36827138
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford Нужна-ли тут нормализация А самому не хочется засунуть все адресные причиндалы в таблицу адресов. заменив кучу полей двумя Current_address_id и previous_address_id ссылающимися на таблицу адресов
stenford какие именно аномалии мы уберем, если вынесем подобные сущности в другие таблицыИзменяя адрес (например корректируя номер дома) мы автоматически изменяем его у всех клиентах ссылающихся на него.
stenford каталога городов, названий улиц и т.п. нет А почему? Пусть не всеобъемлющий, пусть только для адресов в базе, пусть хотя бы для заполнения выпадающих списков.
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36827158
lazovik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а у мня вот так:
Код: plaintext
1.
2.
3.
4.
5.
  [Address_Id] INTEGER
  [Address_Parent] INTEGER
  [Address_Name] NVARCHAR( 50 )
  [Address_Type] INTEGER
  [Address_Index] NVARCHAR( 6 )
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36827177
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257А самому не хочется засунуть все адресные причиндалы в таблицу адресов. заменив кучу полей двумя Current_address_id и previous_address_id ссылающимися на таблицу адресов.
"хочется" не аргумент, мне не себя надо убеждать, а других для изменения существующей схемы
SERG1257Изменяя адрес (например корректируя номер дома) мы автоматически изменяем его у всех клиентах ссылающихся на него.
эта функциональность отсутствует, для изменения адреса каждого клиента будет открыто отдельное окно и корректироваться будет отдельно.
SERG1257
А почему? Пусть не всеобъемлющий, пусть только для адресов в базе, пусть хотя бы для заполнения выпадающих списков.
для заполнения выпадающих списков это ненужно, можно просто собрать их запросом типа select distinct Current_Address_City from dbo.Client
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36827239
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford"хочется" не аргумент, мне не себя надо убеждать, а других для изменения существующей схемы
Если изменение схемы не очевидно - зачем тогда "копья ломать"?
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36827912
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordНарушена 3-я нормальная формаРаз вы утверждаетет, что 3НФ нарушена, то значит знаете и то какие тут аномалии. Сторонний же человек, не зная вашей постановки задачи, не сможет сказать ничего конкретного. Я, например, не вижу, что у вас однозначно есть функциональные зависимости атрибутов. Например, вполне допускаю такую постановку задачи, где поле state от поля city не зависит.
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36828005
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> какие именно аномалии мы уберем, если вынесем подобные сущности в другие таблицы?

Зависит от того, что и как вы собираетесь выносить.

> Ведь по-сути тут связь один к одному.

Никогда и не было такой связи применительно к адресам.

> Проблемы типа ошибок в названии города не важны

Вы точно занимаетесь проектированием баз данных? Разместите объяву в разделе "Работа", полагаю, за небольшие деньги найдете студентов, которые приведут описанное непотребство к разумному виду.
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36828809
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford эта функциональность отсутствует, для изменения адреса каждого клиента будет открыто отдельное окно и корректироваться будет отдельноТо есть если почтовый индекс был введен неправильно тогда оператор должен вручную перебить все адреса и все предыдущие адреса. Если это приемлимо, тогда какой дальше разговор. Размер базы наверное тоже несущественный (на нормализации много не выгадаете)
stenford можно просто собрать их запросом типа select distinct Current_Address_City from dbo.ClientДля ваших идеальных данных (которые не надо править) и небольших (скан таблицы всех клиентов - фигня) это может быть приемлимо.
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36828919
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SERG1257То есть если почтовый индекс был введен неправильно тогда оператор должен вручную перебить все адреса и все предыдущие адреса.Если учесть, что у каждого клиента в индексе собственные ошибки (так как каждому клиенту он вбивался независимо), то слово "вручную" уже не так страшно.
:)
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36829633
VasilyEX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю стоит сделать
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36829960
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
Нарушена 3-я нормальная форма, вопрос такой - какие именно аномалии мы уберем, если вынесем подобные сущности в другие таблицы? Ведь по-сути тут связь один к одному.
В реальной предметной области, которую пытается отобразить БД, связь тут все-таки "один ко многим" (у многих клиентов город текущего адреса один и тот же). ИМХО имеет смысл не только вынести в отдельные сущности улицы, города, штаты (области) и т.п. и потратиться на формирование справочников хотя бы из существующих данных, но и выделить адреса вообще в отдельную таблицу, оформив все примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
table CLIENT
(
    ID,
    ADRESS_ID,
    ...
);

table ADRESS
(
    ID,
    CREATED_DATE,    // все адреса клиента можно отсортировать в хронологическом порядке
    UNIT_NO,
    HOUSE_NO,
    STREET_ID,
    ...
);

table STREET
(
    ID,
    STREET_TYPE_ID,  // улица, бульвар, переулок, шоссе, ...
    CITY_ID,
    ...
);

table CITY
(
    ID,
    CITY_TYPE_ID,   // хутор, деревня, село, пгт, город
    STATE_ID,
    ...
);

table STATE
(
    ID,
    PARENT_ID,      // ID родительского STATE
    STATE_TYPE,   // район, волость, область, автономный округ, федеральная земля, кантон, ...
    COUNTRY_ID,
    ...
);
Сущность STATE имеет древовидную структуру, т.к. в разных странах уровень вложенности единиц адм.-терр. деления разный (Владимирецкий район относится к Ровенской области в Украине, кантон Берн не не имеет родителя в Швейцарии. А город Нетешин в Хмельницкой области в Украине является городом областного подчинения, т.е. для него STATE_ID = "ID Хмельницкой области", а не Славутского района, в котором он расположен территориально.
Конечно, если БД нужна только для обеспечения обратной связи с актуальными на данный момент клиентами, то Вашей структуры БД хватит. Но перспектив в плане развития у нее явно никаких нет. Хотя, конечно, если встанет задача запоминать более чем один предпоследний адрес, то можно добавить еще N полей...
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36830680
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bogdanov AndreyРаз вы утверждаетет, что 3НФ нарушена, то значит знаете и то какие тут аномалии. Сторонний же человек, не зная вашей постановки задачи, не сможет сказать ничего конкретного. Я, например, не вижу, что у вас однозначно есть функциональные зависимости атрибутов. Например, вполне допускаю такую постановку задачи, где поле state от поля city не зависит.
если-бы знал, то не стал-бы открывать топик. Повторюсь, связь адресов и клиентов - один к одному, никаких валидаций ошибок в названиях и почтовых индексов нет, одной из причин этого является то, что 90% новых данных поступает из внешней системы, если в названии города ошибка, то запись все равно идет в систему.
Вообще, может можно сказать, что тут нет нарушения третьей формы? Т.е. скажем аттрибут Город или Улица в такой постановке напрямую зависит от клиента? Область банковская

Хотя одну аномалию я кажется нашел, скажем если в адресе есть not null столбцы, то в случае одной таблицы они все равно должны быть обьявлены как null (т.е. потребуется как минимум добавлять check constraint) и соответственно возможна ситуация когда обязательное поле будет отсутствовать
SERG1257
То есть если почтовый индекс был введен неправильно тогда оператор должен вручную перебить все адреса и все предыдущие адреса
Для ваших идеальных данных (которые не надо править) и небольших (скан таблицы всех клиентов - фигня) это может быть приемлимо.

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

как нормализовать схему я знаю. Вопрос про то, какие именно логические аномалии имеются в текущей схеме
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36831096
Bogdanov Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordВообще, может можно сказать, что тут нет нарушения третьей формы? Т.е. скажем аттрибут Город или Улица в такой постановке напрямую зависит от клиента?Я же говорю, что все зависит от бизнес-требований.
По вашим словам похоже на то, что зависимостей одних атрибутов от других нет. Понятно, что это несколько не стыкуется со здравым смыслом (по крайней мере с общепринятыми представлениями о том, что такое адрес), но во главе угла стоит не здравый смысл, а постановка задачи.

stenfordХотя одну аномалию я кажется нашел, скажем если в адресе есть not null столбцы, А они есть? Не зная требований опять же трудно судить. Скажем, может ли у клиента быть улица при отсутствующем городе?
В любом случае вынесение адреса в отдельную таблицу выглядит разумным.
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36832805
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дайте гляну в хрустальный шар.
У вас есть некая система которая лично stenford режет глаз и вы ищете аргументы за перепроектирование.
В то же время
1 Вероятность совпадения адресов (текущих или предыдущих) у клиентов (говорить про один-к-одному я бы не стал) небольшая
2 Обработка адресов в вашем приложении минимальна - они извне приходят и используются у вас только для печати (вы не шлете писем по адресам, не гоняете курьеров)
3 Производительность, размер базы и т.п. малозначащий факт по сравнению с необходимостью что-то менять
4 В случае форс-мажора типа переименование Ленинграда в Петербург или улицы - дополнительные усилия оператора или программиста - несущественны.

Если все предположения верны, то единственный ваш козырь - производительность.
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36854596
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно, если вдруг попросят хранить пре-превиос адрес, заведем еще 53 новых поля?)

как минимум сократить таблицу до
current полей
приставку current убрать
как только клиент меняет адрес - новая запись
добавить флаг с типом дата: с какого момента адрес стал актуальным, в котору и заносить дату смены адреса... все кто ранее по дате и будут ваши превиос. ну как то так...
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36854597
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford,

стремление к 3нф - это конечно благое дело...но пожалейте людей..при смене адреса
они
меняют старый адрес на текущий
текущий на новый..это же безумие? даже если вы это автоматизировали- это само по себе безумие)
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36854600
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не захотят они 2 предыдущих адреса, это банковская система и подобные требования устоялись годами. И потом отслеживать адреса в реальном времени никто не собирается, это по сути система подачи заявок на кредит - при подаче заявки от клиента просят 2 адреса и все. Если он подает заявку еще раз - сбор информации идет по новой.
...
Рейтинг: 0 / 0
Нужна-ли тут нормализация
    #36861097
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford,

так это не таблица клиентов, а таблица заявок. А в заявке все атрибуты зависят только от Client_ID (ID заявки?), потому как клиент вприципе может писать в заявку всё что захочет и никаких ФЗ между неключевыми атрибутами предполагать не приходится.

Повторное использование наборов Address_% не является каким либо нарушением. Объяви доменный тип ADDRESS и получишь таблицу:

ADDRESS is object
(
UnitNo
HouseNo
StreetName
StreetTypeID
City
State
Postcode
);

Client_ID
Name
Surname
Current_Address ADDRESS,
Previous_Address ADDRESS
.

Т.е. Current_Address и Previous_Address просто два разных атрибута записи, только в старых СУБД их приходится разваливать на компоненты.

Можно так же заметить, что таблица

table addr of ADDRESS

будет состоять только из ключевых атрибутов, так что смысла в ней чуть.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Нужна-ли тут нормализация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]