Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Человек->город->страна. Если город не указан, то в какой он стране?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4348
Давно сталкиваюсь с этой неприятной ситуацией.
Общий случай
Люди
ФИО Город_ID

Города
ID Город Страна_ID

Страны
ID Страна

Если юзеру укажу, что он в городе ID=12, то по этому городу ясно, в какой он находится стране.
Но если город не указан, то как указать страну?

Есть несколько решений у меня в голове, но ни одно меня не устраивает, дефективные они все (хотя именно так пока и справлялся)

  • Создать город "Регионы России". Не подходит, ибо если город не задан, то должна быть надпись "город не задан", либо пусто. А если стран 1000? То добавить 1000 фиктивных городов? Бредовое решение.
  • Добавить избыточность, поставив крест на нормальных формах. В моей проге сейчас и без того полно избыточностей (в связи с оптимизацией доступа). "Города-страны" - это я в пример привёл. У меня в программе подобных ситуаций, когда 3-4 таблицы идут каскадом, полно. Это при том, что БД пока небольшая (55 таблиц). И мне теперь на каждую делать избыточность и следить, чтобы она не была противоречивой? Это тяжело будет поддерживать в большой БД.

    (админы-модераторы, почему у меня текст отступает от края экрана после списка пунктов списка?)

    Мой случай.
    Я тут всё клепаю свою программулину по соревнованиям.
    Один из таких каскадов - вместо "городов" у меня "весовые категории", а вместо "стран" - "возрастные категории"
    Каждой возрастной категории соответствует свой список весовых категорий.
    Участник
    ФИО Вес_ID
    Петров1

    Весовые категории
    ID ВесКат ВозрастКат_ID
    1 33-35кг2

    Возрастные категории
    ID ВозрКат
    1 8-9 лет
    2 10-12 лет

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

    Как быть?
    Какое существует грамотное решение этой ситуации?
  • 4 ноя 16, 03:47    [19858087]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    o-o
    Guest
    Мой адрес -
    Не дом и не улица,
    Мой адрес -
    Советский Союз.

    Так и запишите тем, кто не указал город
    4 ноя 16, 07:51    [19858130]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    iljy
    Member

    Откуда:
    Сообщений: 8711
    Charles Weyland,

    в идеальном мире все было бы стройно и прекрасно: нормальные формы - соблюдались, условия целостности - проверялись, а пользователи никогда-никогда не пытались бы предоставить неполные данные. Но увы, это мир полон страданий, поэтому при решении задачи нужно исходить из ее постановки. И если задача ставится так, что пользователь может не указать город, а только указать страну, значит надо эту возможность обеспечить. Какие тут могут быть варианты решения:

    1. Добавить в города для каждой страны вариант типа "регионы такой-то страны". Плюсы: все условия нормальных форм и целостности при этом соблюдаются. Минусы: в такой концепции задача явно отследить пользователей, у которых город не задан, становится довольно муторной, надо вводить какие-то дополнительные флаги, указывающие, что это особый вариант; если у нас несколько уровней иерархии и мы можем остановиться на любом уровне, то такие "особые варианты" мы должны будем создавать для каждого уровня иерархии (регионы россии, регионы приволжского ФО, регионы Башкирии...).
    2. Добавить в конечную запись ВК на справочники всех уровней и позволить им становиться NULL начиная с любого. Плюсы: явно выделяются неопределенности. Минусы: возникает задача проверки согласованности ссылок (т.е. проверить, что если регион - Астраханская обл, то город реально к ней относится, прямое следствие нарушения 3НФ), такое реализуется только скалярными функциями, а они производительностью не отличаются, ну и много их надо, по одной на каждый уровень.
    3. Добавить в конечную запись ВК на справочники всех уровней и потребовать, чтобы определен был не более чем один из них. Плюсы: все наглядно и просто проверять. Минусы: мы не получаем никаких выигрышей от денормализации, т.к должны получать все значения, начиная с доступного, с помощью последовательного соединения справочников, а написание этих соединений со всеми проверками становится довольно громоздким.


    А дальше сами решайте, что вам вкусней.
    4 ноя 16, 09:35    [19858177]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    LSV
    Member [заблокирован]

    Откуда: Киев
    Сообщений: 30817
    А если стран 1000? То добавить 1000 фиктивных городов?
    Реально стран будет менее 200. Или даже менее 100.

    Самое правильное решение - иметь в каждой стране фиктивный город "город не определен". И нужно иметь некий однозначный признак у такого города (в названии или отдельных полях ).
    Тогда мы легко выловим всех пассажиров, у кот. неизвестен город, но известна страна.
    4 ноя 16, 12:15    [19858392]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    Cane Cat Fisher
    Member

    Откуда:
    Сообщений: 1809
    Charles Weyland,

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

    Например, если вы хотите вывести количество людей, сгруппированное по городам, то куда девать не указавших город?

    ГородКоличество людей
    Москва1000
    Питер100
    не указано999


    Логично получить их отдельной строкой. И сразу видно, что в случае с фиктивными записями это не потребует вообще никаких усилий - пиши себе GROUP BY Город, а со всякими пустыми ссылками - уже чуть сложнее и тормознутее. А другие запросы могут быть наоборот.
    4 ноя 16, 12:23    [19858403]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    Charles Weyland
    Member

    Откуда: Feorina "Fury" 161
    Сообщений: 4348
    LSV
    Реально стран будет менее 200. Или даже менее 100.

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

    LSV
    Самое правильное решение - иметь в каждой стране фиктивный город "город не определен"

    И будет у меня несколько тысяч одинаковых "город не определён".
    Ладно, если речь реально о городах, то можно сделать "города в России", "города в Германии". А если речь о возрастной и весовой категории?
    ФИОВозраст Вес
    Петя18-2045-49
    Ян18-2050-55
    Аня 21-24не указанный вес при возрасте 21-24

    вот последняя строка ж не логичная получается. Поэтому реально в "центральной" таблице мне придётся прописать ссылки на все таблицы, которые напрямую, или через другие таблицы с ней связаны.
    Вот только не нравится мне такое решение... Уже хочется свою nosql базу запилить, т.к. в sql ни запроса на получение многомерной таблицы не сделаешь, ни вот даже эту элементарную вещь не учесть.
    4 ноя 16, 13:08    [19858494]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    Charles Weyland
    Member

    Откуда: Feorina "Fury" 161
    Сообщений: 4348
    Cane Cat Fisher
    И сразу видно, что в случае с фиктивными записями это не потребует вообще никаких усилий - пиши себе GROUP BY Город

    Сразу видно?
    Вот не видно - и ты не увидел, что получится что-то типа того
    ГородКоличество людей
    Москва1000
    Питер100
    не указано17
    не указано29
    не указано514
    null 899

    три "не указано" относятся к разным странам, путаница с тем, что они называются одинаково, при этом относясь к разным странам. Поэтому и название им логично дать разное. И плюс добавятся те, у которых даже страна не указана.
    4 ноя 16, 13:11    [19858500]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    TaPaK
    Member

    Откуда: Kiev
    Сообщений: 6801
    Charles Weyland,

    автор
    три "не указано" относятся к разным странам, путаница с тем, что они называются одинаково, при этом относясь к разным странам. Поэтому и название им логично дать разное. И плюс добавятся те, у которых даже страна не указана.

    ну так выведите страну и сразу станет понятно
    4 ноя 16, 13:32    [19858526]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    TaPaK
    Member

    Откуда: Kiev
    Сообщений: 6801
    Charles Weyland,

    ну и заводить "пустой" город под каждую страну явно неадекватное решение.
    4 ноя 16, 13:35    [19858532]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    Cane Cat Fisher
    Member

    Откуда:
    Сообщений: 1809
    Charles Weyland
    Cane Cat Fisher
    И сразу видно, что в случае с фиктивными записями это не потребует вообще никаких усилий - пиши себе GROUP BY Город

    Сразу видно?
    Вот не видно - и ты не увидел, что получится что-то типа того
    ГородКоличество людей
    Москва1000
    Питер100
    не указано17
    не указано29
    не указано514
    null 899

    три "не указано" относятся к разным странам, путаница с тем, что они называются одинаково, при этом относясь к разным странам. Поэтому и название им логично дать разное. И плюс добавятся те, у которых даже страна не указана.


    Разумеется, "не указанные города"-записи должны относиться каждая к конкретной стране. А как вы их подаете пользователю - совершенно отдельный вопрос - "не указано" + вытянуть страну из ссылки, "пусто" или "мой адрес Советский Союз". Не следует отождествлять способ хранения информации, и пользовательский интерфейс. Разумеется, между ними может и должен быть программный слой. Просто с фиктивными записями в каких-то случаях можно добиться, чтобы он бы минимальным.
    4 ноя 16, 13:37    [19858536]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    LSV
    Member [заблокирован]

    Откуда: Киев
    Сообщений: 30817
    TaPaK
    Charles Weyland,

    ну и заводить "пустой" город под каждую страну явно неадекватное решение.
    Низачот. Т.к. вы не назвали адекватное решение :)

    А если речь о возрастной и весовой категории?
    В отличие от сабжа это не связанные понятия. А если все таки должны быть связаны, то выход один - перечислить все комбинации.

    зы: толчете тут воду в ступе...
    4 ноя 16, 15:19    [19858704]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    Charles Weyland
    Member

    Откуда: Feorina "Fury" 161
    Сообщений: 4348
    LSV
    В отличие от сабжа это не связанные понятия.

    Это связанные категории.
    Ровно одной возрастной категории соответствует 1 или несколько весовых категорий.
    Второй возрастной категории соответствует другой набор весовых категорий. Если он совпадёт - то это случайность и в любой момент может быть подредактирована на несовпадающее значение. Поэтому в таблице весовых категорий могут быть повторяющиеся значения, поскольку в действительности они относятся к совершенно разным возрастным категориям.
    4 ноя 16, 16:56    [19858951]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    TaPaK
    Member

    Откуда: Kiev
    Сообщений: 6801
    Charles Weyland,

    автор
    Ровно одной возрастной категории соответствует 1 или несколько весовых категорий.

    -Я изобрел автомат для бритья
    -Как это?
    -Ну,всовываеш в него лицо и он тебя бреет.
    -Но у всех людей рельеф лица разный.
    -Поначалу да...

    нормализация на уровне :)
    4 ноя 16, 17:04    [19858966]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    Andrej_f
    Member

    Откуда: г. Курган
    Сообщений: 750
    ФИО Город_ID Страна_ID ВесКатID ВозрастКат_ID ...ID ...ID ...ID
    4 ноя 16, 17:07    [19858970]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    Charles Weyland
    Member

    Откуда: Feorina "Fury" 161
    Сообщений: 4348
    TaPaK
    Charles Weyland,

    автор
    Ровно одной возрастной категории соответствует 1 или несколько весовых категорий.

    -Я изобрел автомат для бритья
    -Как это?
    -Ну,всовываеш в него лицо и он тебя бреет.
    -Но у всех людей рельеф лица разный.
    -Поначалу да...

    нормализация на уровне :)

    а у меня наоборот.
    Одинаковым может быть, но делается учёт на то, что в разных возрастных категориях существует своя градация весовых категорий.
    4 ноя 16, 17:14    [19858987]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    Гулин Федор
    Member

    Откуда: МИНСК
    Сообщений: 1256
    Общий случай
    Люди : ФИО , Город_ID

    я бы добавил сюда страну

    ну и -1 (НЕ нулл) для неизвестного города и все.
    4 ноя 16, 17:56    [19859047]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    Uridian
    Member

    Откуда: Lobnya
    Сообщений: 220
    Charles Weyland
    Давно сталкиваюсь с этой неприятной ситуацией.
    Общий случай
    Люди
    ФИО Город_ID

    Города
    ID Город Страна_ID

    Страны
    ID Страна

    Как быть?


    предлагаю изменить структуру
    Жители
    ID жителя ФИО ID Места проживания

    МестА проживания
    ID Места проживания Название места проживания Признак город-страна Входит В (ID места проживания)
    7 ноя 16, 11:41    [19864987]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    baracs
    Member

    Откуда: Москва
    Сообщений: 7204
    Charles Weyland
    Каждому участнику приписываю запись из таблицы "весовые категории" и, таким образом, легко определяю его возрастную через таблицу весовых.
    Charles Weyland
    LSV
    В отличие от сабжа это не связанные понятия.

    Это связанные категории.
    Ровно одной возрастной категории соответствует 1 или несколько весовых категорий.
    Второй возрастной категории соответствует другой набор весовых категорий. Если он совпадёт - то это случайность и в любой момент может быть подредактирована на несовпадающее значение. Поэтому в таблице весовых категорий могут быть повторяющиеся значения, поскольку в действительности они относятся к совершенно разным возрастным категориям.
    Подбирать к возрастной группе допустимую весовую категорию - это понятно. Но по весовой категории определять возраст - это бред.
    Вы придумали искусственную связь и теперь с ней мучаетесь.

    Чтобы знать возраст человека, достаточно хранить его дату (год) рождения. А уж к возрасту прикручивайте свои категории.
    7 ноя 16, 12:39    [19865255]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    Charles Weyland
    Member

    Откуда: Feorina "Fury" 161
    Сообщений: 4348
    baracs
    Чтобы знать возраст человека, достаточно хранить его дату (год) рождения. А уж к возрасту прикручивайте свои категории.

    не-а. не-не-не.

    Есть возрастная категория, в которой участвует человек.
    Скажем, если ему 19 лет, то он может подать заявки и участвовать в категориях 16-19 и 20-25.
    Так же и с весом. У него 48, он подаёт заявки на 45-49 и 50-55. А если совсем дерзкий и организаторы не против (да, такое может быть и такое бывает), то может попытаться в "тяжёлой" категории 56-60.

    так что не программе решать, в каких весовых и возрастных категориях он участвует, а судьям. И они записывают всё это в заявки.

    А то, что
    baracs
    Но по весовой категории определять возраст - это бред.

    А если я переименую таблицу "весовые категории" в, скажем, "возраст-вес", то уже не бред, а всё логично. Хотя таблицы и связи остались теми же.
    7 ноя 16, 13:35    [19865461]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    alex_trg
    Guest
    TerritoryIDNameTypeParentID
    1WordWorld1
    5East EuropeRegion1
    100RussiaCountry5
    1199MoscowCity100
    5999TagankaStreet1199


    может быть форейн кей на TerritoryID?
    7 ноя 16, 14:57    [19865892]     Ответить | Цитировать Сообщить модератору
     Re: Человек->город->страна. Если город не указан, то в какой он стране?  [new]
    o-o
    Guest
    какой бредовый топик.
    люди тут себе могут заказать и несколько возрастов, и разный вес.
    тогда чего страдать-то, это же отдельная таблица заявок,
    куда надо класть: ид персонажа, ид возрастной категории и ид весовой категотии.
    и число строк на человека будет возрастать "в зависимости от его наглости"
    7 ноя 16, 15:01    [19865920]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить