|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
17-77 3. таблица order (ид - данные заказа - страна - ... - дом) - при выборе адреса пользователем, выбранный адрес копируется в эти поля, иначе если пользователь через год поменяет адрес - то у старых заказов он тоже поменяется в таблице адресов можно неск.адресов держать, с датами added/closed, и юзать актуальный а вот это вот всё - сжечь. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 12:58 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
softwarer 1. Увеличение трудоёмкости в бизнес-логике, затрагивающей таблицу order 2. Кардинальное (в несколько раз) увеличение размера базы. Его последствия - снижение эффективности кэширования, удорожание бэкапов и т. п. 3. Кардинальное увеличение нагрузки при любой аналитике по адресам. Что то вы как то сразу в энтерпрайз все перевели, на сколько я понял речь идет о десятке тысяч заказов в год на ремонт/установку чего нибудь в небольшом городе, в таком раскладе десятилетний прирост объемов потянет любой современный ноутбук. Да и ТС судя по задаваемым вопросам не потянет реализацию логики закрытия адресов и замены изменения/удаления вставкой и закрытием старой записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 13:49 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
17-77 softwarer, более детально распишите, где тут неудачные последствия Помимо указанных softwarer-ом, также теряется информация в какой период у пользователя адрес был действующий и когда он его изменил/удалил. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 13:55 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
Алексей Роза 2020 в таблице адресов можно неск.адресов держать, с датами added/closed, и юзать актуальный а вот это вот всё - сжечь. можно, но пока что проще копировать, ведь в требованиях нет - что юзер меняет адреса, мой вариант не требует излишних таблиц и написания кода, но он не сломается, когда внезапно юзер поменяет адрес и вы упустили требование - указывать произвольный адрес (он не хранится у юзера) или выбирать из списка адресов пользователя graycode Помимо указанных softwarer-ом, также теряется информация в какой период у пользователя адрес был действующий и когда он его изменил/удалил. в требованиях этого и нет, вы оба додумываете слишком многое, на самом то деле я не предлагаю в своем решении полную историчность адреса - это больше как побочный эффект softwarer 17-77 более детально распишите, где тут неудачные последствия 1. Увеличение трудоёмкости в бизнес-логике, затрагивающей таблицу order 2. Кардинальное (в несколько раз) увеличение размера базы. Его последствия - снижение эффективности кэширования, удорожание бэкапов и т. п. 3. Кардинальное увеличение нагрузки при любой аналитике по адресам. ну... может быть... 1. поля адреса никак этому не помешают, вот если будет логика для адресов - тогда возможно, но я ж не знаю что будет и будет ли 2. если адреса все же копировать при использовании - то объем таким же и будет, если же проставлять ссылки и тем самым уменьшим объем - будет ли стоить игра свеч? т.е. тут вопрос не бэкапов, а копируем адреса или нет - это отдельная тема и оба варианта имеют как плюсы так и минусы на уровне бизнес-логики, возможных потенциальных ошибок со стороны пользователей, программистов, объема кода и тестов 3. у нас аналитики пока и нет в требованиях, но я заложил возможность выделить адреса в отдельную таблицу, а там уже можно и дубли убрать если надо, и внешний классификатор прикрутить в общем это все совершенно не значит, что в случае обнаружения проблем или появления новых требований я не сделаю шага назад ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 14:50 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
17-77 можно, но пока что проще копировать а потом будете переделывать половину проекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 15:03 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
Алексей Роза 2020, не факт ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 15:08 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
В данном конкретном случае, адрес заказа может быть и таким: "у ворот казармы в свете фонаря, где кружатся попарно листья сентября ...." (С) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 18:00 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
graycode Что то вы как то сразу в энтерпрайз все перевели Отнюдь. Я назвал очевидные недостатки при отсутствии достоинств. То есть вопрос не в том, что это загнётся когда-нибудь потом, а в "Зачем сразу делать хуже, если это вдобавок требует дополнительных сил"? graycode в таком раскладе десятилетний прирост объемов потянет любой современный ноутбук. Потянет, конечно. И если бы подход, например, давал существенный выигрыш в трудоёмкости - он был бы вполне разумен. Но учитывая, что он даёт проигрыш... graycode Да и ТС судя по задаваемым вопросам не потянет реализацию логики закрытия адресов и замены изменения/удаления вставкой и закрытием старой записи. Да не надо там ничего тянуть. Хватит insert-only таблицы адресов и поля у клиента "текущий адрес" (ну либо без поля, что-нибудь типа "по умолчанию берётся адрес предыдущего заказа"). 17-77 1. поля адреса никак этому не помешают, А вот их некопирование - поможет этого не допустить. Тут, конечно, вопрос, что скрывается за "заказом", но кратное увеличение будет почти в любом случае, кроме, наверное, оптовой закупки продуктов. 17-77 если же проставлять ссылки и тем самым уменьшим объем - будет ли стоить игра свеч? Наверняка. Потому что кроме объёма БД, это ещё и уменьшает объём работ, а следовательно и количество ошибок. 17-77 у нас аналитики пока и нет в требованиях Она упоминалась выше. Кроме того, её более чем естественно ожидать. Любой бизнес, переросший Excel, захочет видеть своих клиентов. 17-77 но я заложил возможность выделить адреса в отдельную таблицу Вы не "заложили возможность". Вы упомянули, что со временем придётся переделать в то, что было проще и дешевле сделать сразу. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 18:04 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
softwarer если это вдобавок требует дополнительных сил? Что именно при копировании потребует дополнительных сил? softwarer Потянет, конечно. Если бы потянул, то и темы бы этой небыло, с другой стороны пусть учится делать правильно)) softwarer Да не надо там ничего тянуть. Хватит insert-only таблицы адресов и поля у клиента "текущий адрес" (ну либо без поля, что-нибудь типа "по умолчанию берётся адрес предыдущего заказа"). Флаг - адрес по умолчанию в таблице адресов пользователя. 17-77 и вы упустили требование - указывать произвольный адрес (он не хранится у юзера) или выбирать из списка адресов пользователя Это легко укладывается в логику closed адресов пользователя, заказ в любом случае делает пользователь, произвольный адрес добавляется в таблицу адресов пользователя для пользователя формирующего заказ и этому адресу сразу после подтверждения заказа проставляется атрибут closed. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 18:49 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
graycode Что именно при копировании потребует дополнительных сил? Не только при копировании. Любая операция с адресами в результате потребует перечислять всю портянку полей. При добавлении нового поля и вообще при любом изменении работы с адресами - это изменение потребуется вносить в кучу мест. При этом сто процентов где-то что-то забудут или перепутают, появится бага. И всё это из-за нежелания использовать address_id и не иметь проблем. graycode softwarer Потянет, конечно. Если бы потянул, то и темы бы этой небыло, с другой стороны пусть учится делать правильно)) Есть ощущение, что Вы успели забыть контекст реплики. graycode Флаг - адрес по умолчанию в таблице адресов пользователя. Cомневаюсь, что это лучшее решение, но можно и так. Это уже мелочи. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 19:05 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
softwarer Не только при копировании. Любая операция с адресами в результате потребует перечислять всю портянку полей. При добавлении нового поля и вообще при любом изменении работы с адресами - это изменение потребуется вносить в кучу мест. При этом сто процентов где-то что-то забудут или перепутают, появится бага. И всё это из-за нежелания использовать address_id и не иметь проблем. В контексте задачи топикстартера заказ после подтверждения неизменен, специфика операций с адресами в данной задаче в большинстве случаев потребует доставать всю портянку полей, так что денормализация вполне приемлема. Добавление нового поля в адреса на самом деле еще не означает что это поле будет обязательно необходимо для заказа, к тому же структура адреса достаточно стабильна и не меняется каждую неделю. Зачем вносить что то в кучу мест, если мы говорим конкретно про заказы? Конечно в общем случае вы правы, но в данной задаче возможен самый примитивный и простой денормализованный вариант, который не требует дополнительных усилий, наоборот упрощает дальнейшую обработку заказа. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 19:42 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
graycode Добавление нового поля в адреса на самом деле еще не означает что это поле будет обязательно необходимо для заказа Тогда ещё веселее. В адресе N элементов, из них в заказ нужно скопировать M элементов, в таком-то отчёте сравнивать по K элементам, и при последующем сопровождении нигде не ошибиться. graycode к тому же структура адреса достаточно стабильна и не меняется каждую неделю. А та её часть, которая будет отброшена ибо "пока не надо" - таки постепенно меняется. Здесь, конечно, задача очень малой трудоёмкости, поэтому в принципе на любой вариант можно сказать "легко сделать, не о чем спорить". Но всё же решение "из одних минусов" (с моей точки зрения) меня удивило. graycode Зачем вносить что то в кучу мест, если мы говорим конкретно про заказы? Есть таблица адресов. Есть копирование адреса в заказы. Есть запросы из интерфейса. Есть отчёты, цепляющие адреса. Чем меньше мест и чем проще упоминание в каждом месте - тем проще и надёжнее в сопровождении. graycode наоборот упрощает дальнейшую обработку заказа. Чем же он упрощает? Отсутствием join-а? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 20:19 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
softwarer Тогда ещё веселее. В адресе N элементов, из них в заказ нужно скопировать M элементов, в таком-то отчёте сравнивать по K элементам, и при последующем сопровождении нигде не ошибиться. Система - полторы таблицы, зачем сравнивать по K элементам и с чем? softwarer А та её часть, которая будет отброшена ибо "пока не надо" - таки постепенно меняется. Так и пусть меняется, в заказе зафиксировано все что необходимо для заказа, все остальное для заказа не имеет значения. Более того, если заказ подтвержден, его собирают и отправляют и если он не дойдет до адресата, то его просто закроют с указанием причины отказа, никто ничего в нем менять не будет, по сути после подтверждения пользователем вся информация в заказе read only. softwarer Есть таблица адресов. Есть копирование адреса в заказы. Есть запросы из интерфейса. Есть отчёты, цепляющие адреса. Чем меньше мест и чем проще упоминание в каждом месте - тем проще и надёжнее в сопровождении. Таблица адресов в таких примитивных системах нужна только для того чтобы пользователь не заполнял адрес каждый раз, это просто шаблон для повторного использования одних и тех же данных, отчеты по заказам никуда за адресом не лезут, они берут его из заказа, куда уж проще в сопровождении. softwarer Чем же он упрощает? Отсутствием join-а? Отсутствием реализации логики закрытия использовавшихся в заказах адресов, в том случае если их пытаются изменить или удалить и вставки вместо них новых записей адресов. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2020, 21:06 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
а все догнал, в реальности - не пользователь владеет адресом, а условное здание (оно конечно может поменять адрес, или здание можно снести, но это довольно редко) поэтому берем готовый классификатор, там ид адреса будет строковый и в нем будет закодирована полная инфа об адресе (страна - ... - дом) проектируемая система и ее пользователи не имеют права менять адрес у здания, могут только использовать: * в таблице user_address.address_id проставляется ид адреса из классификатора * в таблице order.address_id так же проставляется ид адреса из классификатора, а не user_address.id таким образом: * пользователь когда редактирует свои адреса в таблице user_address - это никак не затрагивает старые заказы * при создании заказа в order.address_id попадает выбранное значение user_address.address_id из условного выпадающего списка, построенного по таблице user_address для конкретного пользователя * теряется инфа какие старые адреса были у пользователя - но по идее это пока и не надо, если мы заглянем в старый заказ - то там будет имя клиента и какой-то старый его адрес. * историчность самого адреса инкапсулируется в классификаторе, т.е. он при обращении всегда нам отдает актуальную версию, но если передать ему ид адреса из старого заказа - то он его распарсит и вернет версию актуальную на тот момент * при изменении адреса пользователем и если у него есть недоставленные заказы - спросить "а не надо ли поменять в них адреса на новый?" но проблема со статистикой по районам города - в кладре я не нашел районов, там город - и сразу улица. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2020, 09:29 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
17-77 а все догнал, в реальности - не пользователь владеет адресом, а условное здание С точностью до здания. Обычно ещё входят квартира/офис, код домофона и текстовые примечания. 17-77 * в таблице user_address.address_id проставляется ид адреса из классификатора * в таблице order.address_id так же проставляется ид адреса из классификатора, а не user_address.id Так, конечно, лучше. Хотя таблица user_address продолжает быть избыточной. 17-77 но проблема со статистикой по районам города - в кладре я не нашел районов, там город - и сразу улица. Нынче уже в ФИАС логично смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2020, 11:20 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
softwarer Александр1918 Таблица заказов в последствии будет огромной Ох эти розовые мечты.... К сожалению в данном случае, это неизбежность. Dimitry Sibiryakov Александр1918Аналитические отчеты планируются. По адресам в том числе Чисто из любопытства: зачем? Что-то типа "на третьей строительной заказов на 3% меньше, чем на второй, надо туда послать пару людей раскидать рекламу по ящикам"? Я неправильно выразился. Не по конкретным адресам, а по районам за период. Например, сроки выполнения заказов (уложились ли в прогнозируемое время или нет), оценки заказчиков и т.д. Реже это будет формироваться по улицам. В целом статистические отчеты будут формироваться в худшем случае раз в сутки, реально же не чаще раза в неделю. В принципе на производительности системы это не должно сказаться. graycode softwarer 1. Увеличение трудоёмкости в бизнес-логике, затрагивающей таблицу order 2. Кардинальное (в несколько раз) увеличение размера базы. Его последствия - снижение эффективности кэширования, удорожание бэкапов и т. п. 3. Кардинальное увеличение нагрузки при любой аналитике по адресам. Что то вы как то сразу в энтерпрайз все перевели, на сколько я понял речь идет о десятке тысяч заказов в год на ремонт/установку чего нибудь в небольшом городе, в таком раскладе десятилетний прирост объемов потянет любой современный ноутбук. Да и ТС судя по задаваемым вопросам не потянет реализацию логики закрытия адресов и замены изменения/удаления вставкой и закрытием старой записи. В моем случае будут довольно большие объёмы данных. Из старой базы будет перенесено порядка 700к записей заказов + прогнозируемый рост 200 - 250к записей заказов в год. Так что вопрос оптимизации структуры базы актуален. В процессе анализа добавилось новое требование . У нас есть много улиц которые находятся в 2х и больше районах города. Желательно чтобы при внесении в форму заказа/юзера улицы и дома, автоматически подтягивался район города к которому этот дом относится. Это нужно чтобы правильно определить исполнителя по заказу ( есть отдел/филиал в каждом районе с соответствующим разделением обязанностей ). То есть в базе должен быть справочник домов с привязкой к району. Проблема в том, что на данный момент этих данных нет, но они могут появится в будущем. Базу нужно спроектировать таким образом, чтобы позже безболезненно добавить этот функционал. С учетом новых требований и вариантов предложенных в этой теме, набросал новую схему. 1. От таблицы полных адресов отказался. Вместо него добавил справочник домов с ID улицы и номером дома (в дальнейшем там может быть ID района). 2. В таблицах заказов и юзеров оставил номер квартиры, подъезда, этаж, и домофон. Эти данные не будут принимать участия в формировании статистики и будут использоваться только 1 раз при выполнении заказа. Тут с некоторым дублированием данных придется смирится ( например, при нескольких заказах из одной квартиры ). 3. У юзера в профиле будет всегда один адрес - его собственный. Это связанно со спецификой задачи, поэтому вариант с вынесением адресов юзера в отдельную таблицу я не рассматривал. При формировании заказа юзер может указать произвольный адрес совершенно никак с ним не связанный (примерно 20-30% случаев). Из вышеперечисленного следует такая логика работы с адресами в положении: при внесении или изменении значений в полях улицы или номера дома и сохранении формы (заказа или юзера), нужно делать проверку, есть ли в справочнике домов указанный адрес. Если есть, то вносить ID дома в таблицу заказа/юзера, если нет, то создавать новую запись в справочнике домов, а потом вносить ее ID в таблицу соответствующего заказа/юзера. В таком случае, если удастся получить справочник домов с привязкой к району, то существующий справочник можно будет безболезненно расширить. Вроде уже выглядит не плохо. Какие на ваш взгляд недостатки могут быть у такого решения? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2020, 14:41 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
Александр1918В принципе на производительности системы это не должно сказаться. Это вопрос не производительности, а эргономики. Не надо без крайней нужды в базу тащить информацию, которую оператор задолбается вводить. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2020, 14:47 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
Александр1918 К сожалению в данном случае, это неизбежность. Нет. Александр1918 Из старой базы будет перенесено порядка 700к записей заказов + прогнозируемый рост 200 - 250к записей заказов в год. О чём и речь. Миллион записей был приличным объёмом в начале двухтысячных. Сейчас, когда я делаю пробные примеры на своём ноутбуке - делаю таблички по десять миллионов, иначе всё срабатывает слишком быстро. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2020, 14:49 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
Александр1918, Берите готовое решение и не мучайтесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2020, 16:36 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
Александр1918, Вы нарисовали полный трэш. Начинайте не с фантазий, а с процесса, рисуйте сначала процесс и сущности которые в нем участвуют, а не таблицы. На сколько я понял у вас заказчики которые заказывают какую либо услугу, заказчики внутренние корпоративные или внешние? Если внешние, то им очень глубоко фиолетовы все ваши таблицы и id, заказчик хочет заказать услугу, но адреса в вашей системе нет, что ему делать? Отдел НСИ в организации есть? С номерами домов не все так просто, там есть корпуса, владения, строения и прочее разнообразие, есть человек обязанностью которого будет расфасовка всего этого по районам? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2020, 18:57 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
Мдя... Я бы взял за основу принцип Али Экспресс: Всю ответственность за адрес доставки нужно повесить на самого Клиента (с минимальными элементами контроля ввода): - При регистрации Клиент сам указывает адрес доставки, и их может быть несколько, и один по умолчанию, соответственно к таблице Клиент вешается таблица Адресов Клиента : ИД_Клиента + Адрес Доставки - Естественно при оформлении заказа Клиент сам выбирает из списка нужный адрес доставки. Весь Адрес тупо сливается в строку и одним полем вешается к заказу... Таким образом если даже Клиент поменяет или удалит адреса, на историю доставленных заказов это не повлияет, документ заказа останется неизменным... Дополнительно можно еще в заказ добавить и код Адреса доставки Клиента (вдруг попрет и нужна будет статистика) Но имхо однозначно Адреса доставки и физически и логически и юридически нужно вешать на Клиента, куда сцуко закажет, туда и поедет получать, а не так или не туда закажет - так с него и спрос... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2020, 01:11 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
Сразу отвечаю на возможные детские вопросы: Если не предполагается отправка почтой или СДЕК ами и вам ванпенисуально что вместо Иванова получит заказ Сидоров, и вы не хотите давать возможность Клиенту сделать подарок любимому человеку (оформив доставку на него) - то паспорт не обязателен ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2020, 01:32 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
vmag Дополнительно можно еще в заказ добавить и код Адреса доставки Клиента (вдруг попрет и нужна будет статистика) В таком случае нужно делать логику read only для адресов использованных в заказах, выше было горячее обсуждение быть или не быть копировать или не копировать адрес в заказ)) Но у топикстартера есть желание собирать какую то статистику для заказов по районам и улицам, при этом если улица длинная, то ее дома попадают в разные районы, правда он пока не осознал что заниматься раскидываением строений, владений, домов и их корпусов по районам он буде сам и ручками. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2020, 01:41 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
vmag Если не предполагается отправка почтой На сколько я понимаю там не заказы, а заявки на выполнение каких то услуг, отправка сантехника посылкой это конечно интересно, но сомневаюсь что сантехник сильно обрадуется такому способу доставки его бренного тела к месту оказания услуги)) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2020, 01:45 |
|
Вопрос по проектированию БД
|
|||
---|---|---|---|
#18+
graycode, По первой странице вообще не понятно о чем речь, сантехников тоже не наблюдается, но ТС щас забульбенит базу в которой кладра будет тонна, а реальной движухи 2 грамма, я б начал с простой строки адреса чтоб быстро запустить проект и посмотреть выхлоп, я тоже всплакнул по мечтам и грезам... по началу то статистику можно и по умному контексту попробовать поискать ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2020, 02:05 |
|
|
start [/forum/topic.php?fid=32&msg=40009093&tid=1539831]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 169ms |
0 / 0 |