|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovtip78а зачем плодить "черновики"? Затем, что у пользователя может внезапно упасть интернет, а когда он вернётся на следующий день, ему будет приятно видеть, что его корзина сохранилась и ему не надо её заново набивать. "упадёт" она, только если вы её удалите так вот не удаляйте. и не придётся лепить кучу ненужных таблиц ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 13:11 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registererstip78любители хранить корзины отдельно, какую ценность для вас несёт первозданная корзина ДО кнопки "оформить заказ" ? после звонка менеджера выяснится, что чего-то нет, что-то забыли доложить, что-то надо заменить важны не эти изменения, а только ОПЛАЧЕННЫЙ ЗАКАЗ = транзакция: -товар +деньги а зачем плодить "черновики"? Бугога)) А по какому признаку вы собираетесь агрегировать товары в таблице? По времени добавления в корзину?))) по id, например :рукалицо: нормальную форму бегом гуглить, пока ваше понимание "таблиц" и "реляционности" не придёт в норму ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 13:16 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
tip78Dimitry Sibiryakovпропущено... Затем, что у пользователя может внезапно упасть интернет, а когда он вернётся на следующий день, ему будет приятно видеть, что его корзина сохранилась и ему не надо её заново набивать. "упадёт" она, только если вы её удалите так вот не удаляйте. и не придётся лепить кучу ненужных таблиц Вы вообще в курсе о существовании такого понятия как нормальная форма и зачем это?)) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 13:31 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
tip78registerersпропущено... Бугога)) А по какому признаку вы собираетесь агрегировать товары в таблице? По времени добавления в корзину?))) по id, например :рукалицо: нормальную форму бегом гуглить, пока ваше понимание "таблиц" и "реляционности" не придёт в норму Вы же как раз и предлагаете денормализовать))) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 13:32 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Кот МатроскинregisterersНо тогда возникает вопрос - как обеспечить константность значений полей SubA.Type, SubB.Type, Ограничениями (check), я же сказал. У разных СУБД механизм отличается, но не сильно. Интересно, а какие техники реализации существуют? Например, мне приходит в голову только определение в subtype-таблице поля с ненулевым дефолтным значением TypeId и убрать update/insert из грантов (конечно, если это PostgreSQL). Но это тоже пахнет костылём, ибо дефолтное значение - это часть DDL, т.е. метаинформация, а конкретное значение id supertype-таблицы - это данные. Так что не так всё просто, как вы рисуете... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 13:44 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerersВы вообще в курсе о существовании такого понятия как нормальная форма и зачем это?)) в профили заглядывайте иногда вам бы тут не выёживаться надо, а всасывать каждую букву, коли за помощью пришли со своими дикими идеями ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 14:13 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
tip78registerersВы вообще в курсе о существовании такого понятия как нормальная форма и зачем это?)) в профили заглядывайте иногда вам бы тут не выёживаться надо, а всасывать каждую букву, коли за помощью пришли со своими дикими идеями Вот только давайте без обид и без снобизма, только по сути)) Эмоции часто вредят продуктивной дискуссии. А форумы, кстати, существуют не только для помощи, но и для обмена идеями. Бинго! Просто хочется разобраться в теоретических вопросах, думаю, не только одному мне это интересно. А теперь по сути объясните, почему то, что вы предлагаете не является денормализацией? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 14:24 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registererstip78пропущено... в профили заглядывайте иногда вам бы тут не выёживаться надо, а всасывать каждую букву, коли за помощью пришли со своими дикими идеями Вот только давайте без обид и без снобизма, только по сути)) Эмоции часто вредят продуктивной дискуссии. А форумы, кстати, существуют не только для помощи, но и для обмена идеями. Бинго! Просто хочется разобраться в теоретических вопросах, думаю, не только одному мне это интересно. А теперь по сути объясните, почему то, что вы предлагаете не является денормализацией? обожемойкакой3.14здец отличнаямотивирующаяречь! 1. МЫ тут не ради ваших "квадратных велосипедов идей". Зачем нам деградировать?? В этой теме ВАМ вправляют мозги, а вы наполняетесь счастьем. Просто напомню, что мы находимся в теме с названием, которое вы придумали на полном серьёзе - " РЕЛЯЦИОНКА ТУТ БЕССИЛЬНА? ", где под " ТУТ " подразумевается довольно банальная схема EAV, а конкретно, вы не осилили и извратили элементарное хранение товаров со множеством атрибутов (которые по сути являются свойствами). Т.е. вы своей задачкой для 5 класса просто обоссали всю реляционную алгебру и триллионы человеко-часов довольно неплохих математиков заявив, что они её не тянут. 2. а теперь по сути: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 19:09 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
tip781. МЫ тут не ради ваших "квадратных велосипедов идей". Зачем нам деградировать?? В этой теме ВАМ вправляют мозги, а вы наполняетесь счастьем. Да не бойтесь вы, мышление ещё никогда никого не привело к деградации)) Вот и вправьте мне мозги, ответив на мой вопрос топика, а не уходя от него ;-) tip78Просто напомню, что мы находимся в теме с названием, которое вы придумали на полном серьёзе - " РЕЛЯЦИОНКА ТУТ БЕССИЛЬНА? ", где под " ТУТ " подразумевается довольно банальная схема EAV, Поэтому я и говорю, читайте внимательно первый пост и последующие. Под " ТУТ " подразумевалась конкретная задача, которая часто встречается, а EAV - всего лишь один из способов решения задачи. Собственно, целью сабжа было прояснить, какие вообще подходы к решению задачи существуют и насколько они эффективны. Не зря же придумали документно-ориентированные СУБД. Понимаю, что тема холиварная, но давайте обмениваться аргументами, а не эмоциями! tip78 а конкретно, вы не осилили и извратили элементарное хранение товаров со множеством атрибутов (которые по сути являются свойствами). Т.е. вы своей задачкой для 5 класса просто обоссали всю реляционную алгебру и триллионы человеко-часов довольно неплохих математиков заявив, что они её не тянут. Это не я извратил, это существующий паттерн Flat table костыльный, о чём я и писал (создаётся впечатление, что вы вообще не читали предыдущие посты). И да, есть красивая реляционная теория, а есть суровая практика и я не один раз встречал в ней решения на основе EAV, которые ложили апп на овер 100к айтемов. Поэтому рефакторили такие системы, в том числе применяя денормализацию. Кстати, Magento, тоже отказалась в свое время от EAV. tip782. а теперь по сути: Вот так бы и сразу)) Спасибо за ваш SQL-код, вижу, что вы старались. Но это почти оффтоп. Корзина в поставленной задаче не главное, логика её работы - отдельная тема. То кому-то что-то не понравилось и понеслось... Я вообще пример с магазином придумал потому что он многим знаком. Суть же задачи, которую я ставил состоит в том, возможно ли в денормализованных архитектурах БД выдержать условия однозначности и непротиворечивости реляционных связей? В случае Flat table (type-supertype), это невозможно, что было показано выше. Представьте, у вас есть родительская (supertype) таблица и две дочерние (subtype). Для определения того, с какой из дочерних таблиц заджойнить родительскую, нужно сначала проверить в ней значение поля Type. Вот лучше этот один запрос напишите, тогда и поговорим о реляционной алгебре ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 21:11 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerersНе зря же придумали документно-ориентированные СУБД. Каждый день что-то придумывают. И каждый день некоторые люди узнают, что земля оказывается круглая, но предлагают обсудить также идеи насчёт того, что она вообще-то может быть плоской или квадратной. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 21:49 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerersСуть же задачи, которую я ставил состоит в том, возможно ли в денормализованных архитектурах БД выдержать условия однозначности и непротиворечивости реляционных связей? В случае Flat table (type-supertype), это невозможно, что было показано выше. Правда? И в каком посте? registerers Представьте, у вас есть родительская (supertype) таблица и две дочерние (subtype). Для определения того, с какой из дочерних таблиц заджойнить родительскую, нужно сначала проверить в ней значение поля Type. Нет, не нужно. Ну почитайте что-нибудь про subtype-supertype, в самом деле - как с ним работают, etc. Вы постоянно выдвигаете какие-то нелепые тезисы про него - то дублирования записей нельзя избежать, теперь вот перед join-ом что-то проверять надо... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 22:13 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Кот МатроскинВы постоянно выдвигаете какие-то нелепые тезисы про него - то дублирования записей нельзя избежать, теперь вот перед join-ом что-то проверять надо... Почему же они "нелепые"? Вы так и не привели пример, как можно ограничить возможность ссылаться другим subtype-таблицам на одну и ту же запись supertype-таблицы. Окей, если мой вопрос по джойнам "нелеп", как вы выведете список товаров всех типов?))) Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2017, 23:20 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
hVosttEnnor TiegaelНу и наконец, если пользователь захочет отправить содержимое корзины по нескольким адресам - как у Амазона, "Deliver to multiple addresses" - придется проделывать кучу дополнительных телодвижений. Если корзина и заказ — разные таблицы и сущности, то сделать подобное не проблема Ничто не проблема. Вопрос, зачем делать, если сейчас делать не нужно, а потом возможно придется переделывать? registerers, Я кажется понял, в чем нестыковка. Вы называете "корзиной" элементы заказа. Не советую так делать, имхо лучше сделать отдельную таблицу OrderItems, и в нее копировать записи из корзины (с одновременным удалением их из оной). Это разные сущности, с весьма разнящимися атрибутами. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 04:52 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Ennor TiegaelНичто не проблема. Вопрос, зачем делать, если сейчас делать не нужно, а потом возможно придется переделывать? Ну что поделаешь, не каждому дано думать на пару шагов вперёд. Переделывать всегда сложнее, чем заложить изначально. Надо уменьшать эти издержки по возможности. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 08:49 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerersКот МатроскинВы постоянно выдвигаете какие-то нелепые тезисы про него - то дублирования записей нельзя избежать, теперь вот перед join-ом что-то проверять надо... Почему же они "нелепые"? Вы так и не привели пример, как можно ограничить возможность ссылаться другим subtype-таблицам на одну и ту же запись supertype-таблицы. Кот МатроскинТоже мне, бином Ньютона - включаете поле Type в ключ, накладываете на него соответствующие ограничения в каждой из subtype-таблиц. registerersОкей, если мой вопрос по джойнам "нелеп", как вы выведете список товаров всех типов?))) Код: sql 1. 2.
Наводящее уточнение - у разных типов существенно разные поля (иначе паттерн был бы не нужен). Вы хотите видеть в списке все возможные поля всех типов для каждого товара? Или только общие для всех типов поля? После ответа на это уточнение запрос имхо становится вполне очевидным ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 09:23 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
hVosttEnnor TiegaelНичто не проблема. Вопрос, зачем делать, если сейчас делать не нужно, а потом возможно придется переделывать? Ну что поделаешь, не каждому дано думать на пару шагов вперёд. Переделывать всегда сложнее, чем заложить изначально. Надо уменьшать эти издержки по возможности. Таки расскажите, какой конкретно кейс Вы отдельной таблицей под корзину "закладываете изначально", а в случае единой таблицы "придется переделывать"? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 09:28 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Кот МатроскинТаки расскажите, какой конкретно кейс Вы отдельной таблицей под корзину "закладываете изначально", а в случае единой таблицы "придется переделывать"? Мне ещё раз повторить, что корзина это то, с чем работает пользователь, а заказ это то с чем работают сотрудники магазина? В чём проблема-то, думать головой используя банальную логику, принципы разработки, и закладывать это изначально, а не потом когда-нибудь? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 09:52 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Кот Матроскин, Вы, наверное, меня имели в виду. Моя логика в том, что корзина - сущность временного назначения, и данные там лежат только до тех пор, пока не сформирован(ы) заказ(ы). Семантически она не тождественна позициям заказа - там могут быть какие-то столбцы, неактуальные для позиций заказа, и не быть многих, которые актуальны. Например, все что связано с выбором склада, если таковых больше одного. Или такой вариант: юзер берет 5 экземпляров какой-то позиции, 3 берутся с одного склада, а оставшиеся 2 - с другого. Зачем это в корзине? А когда юзер передумает и уменьшит количество, опять обтанцовывать кактус кругом? Почему мне не нравится идея одной таблицы вместо двух: если / когда пользователь начнет разносить содержимое корзины на несколько заказов, придется делать дополнительные телодвижения в виде апдейта поля OrderId, причем нелинейного - какая-то часть позиций остается в дефолтном заказе, остальные разъезжаются по новым. Учитывая, что я еще ни разу не видел интернет-магазина, где разбивка по заказам сохранялась бы до оплаты, не думаю, что это сильно востребовано рынком. Конечно, если средний заказ состоит из сотен позиций, возможно это и имеет смысл, но сколько таких магазинов? Ну и я до сих пор не увидел рациональной аргументации, зачем пользователю иметь OrderId на стадии наполнения корзины. Вы же понимаете, что столбцы на страницах занимают место, и каждое обращение к корзине будет этот столбец с диска поднимать, даже если он не включен в селект. Ну и размер таблицы в этом случае будет совсем не копеечный. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 09:55 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Кот Матроскин, В большинстве случаев у пользователя всего одна корзина. В определённый момент пользователь делает заказ, корзина «очищается», а заказ остаётся. В это время пользователь может опять накидывать товары в корзину. Далее, разработчики могут предложить функцию мульти-корзины. Самое банальное: отложенные товары в отдельной корзине. Потом можно приделать несколько корзин, чтобы пользователь мог разделить покупки, куплю сейчас, куплю через неделю, куплю когда-нибудь, это себе, это жене.. и т.д. Корзина это чисто пользовательская концепция. Что здесь непонятного? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:00 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Ennor TiegaelНу и я до сих пор не увидел рациональной аргументации, зачем пользователю иметь OrderId на стадии наполнения корзины. Вы же понимаете, что столбцы на страницах занимают место, и каждое обращение к корзине будет этот столбец с диска поднимать, даже если он не включен в селект. Ну и размер таблицы в этом случае будет совсем не копеечный. Дело даже не в этом. Само наличие заказа подразумевает начало некоего workflow, появление нового заказа в системе это событие. А работа с корзиной это совершенно отдельная история. С корзиной могут быть связаны совершенно другие процессы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:02 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
hVosttКот МатроскинТаки расскажите, какой конкретно кейс Вы отдельной таблицей под корзину "закладываете изначально", а в случае единой таблицы "придется переделывать"? Мне ещё раз повторить, что корзина это то, с чем работает пользователь, а заказ это то с чем работают сотрудники магазина? Ну запретить повторить я Вам не могу - свободная страна, все такое :) Но имхо желательно, чтобы аргументы были как-то связаны с защищаемой позицией. Вы начали говорить про "переделывать всегда сложнее". Так что и зачем нужно переделывать ? Вы в рамках одной таблицы никак, просто совсем никак не можете реализовать "корзина это то, с чем работает пользователь, а заказ это то с чем работают сотрудники магазина"? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:12 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Ennor TiegaelКот Матроскин, Вы, наверное, меня имели в виду. Нет, не совсем :) Вы не произносите трескучих фраз "поддерживать дорого", "надо думать изначально" и т.д. Ennor TiegaelПочему мне не нравится идея одной таблицы вместо двух: если / когда пользователь начнет разносить содержимое корзины на несколько заказов, придется делать дополнительные телодвижения в виде апдейта поля OrderId, причем нелинейного - какая-то часть позиций остается в дефолтном заказе, остальные разъезжаются по новым. В смысле - какие дополнительные телодвижения? Что в том что в другом случае у Вас есть некое множество товаров, части этого множества Вам надо разложить на N заказов. Где именно тут дополнительные телодвижения? Наоборот, как я уже говорил, у Вас в системе все равно уже есть API "переложить часть заказа в новый заказ", и Вам не надо делать новую процедуру "переложить часть корзины в новый заказ" Ennor Tiegael Ну и я до сих пор не увидел рациональной аргументации, зачем пользователю иметь OrderId на стадии наполнения корзины. Вы же понимаете, что столбцы на страницах занимают место, и каждое обращение к корзине будет этот столбец с диска поднимать, даже если он не включен в селект. Ну и размер таблицы в этом случае будет совсем не копеечный. У Вас будет CustomerID вместо этого - который точно так же занимает место, поднимается с диска и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:26 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
hVosttДалее, разработчики могут предложить функцию мульти-корзины. Самое банальное: отложенные товары в отдельной корзине. Потом можно приделать несколько корзин, чтобы пользователь мог разделить покупки, куплю сейчас, куплю через неделю, куплю когда-нибудь, это себе, это жене.. и т.д. Корзина это чисто пользовательская концепция. Что здесь непонятного? Что именно из перечисленного у Вас не получается в случае единой таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:32 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Кот МатроскинВы начали говорить про "переделывать всегда сложнее". Так что и зачем нужно переделывать ? Вы в рамках одной таблицы никак, просто совсем никак не можете реализовать "корзина это то, с чем работает пользователь, а заказ это то с чем работают сотрудники магазина"? Я не говорил «никак», в конце концов и микроскопом можно гвозди забивать. Вы мне упорно хотите доказать, что это можно сделать, а я с этим даже спорить не собираюсь. Если вам удобно, можете и кулаком забивать, дело сугубо ваше. Корзина и заказ — разные вещи по сути и по логике. Адекватный разработчик в БД для разных вещей смоделирует отдельные таблицы. С чём вы пытаетесь спорить я до сих пор не пойму. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:55 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Кот МатроскинЧто именно из перечисленного у Вас не получается в случае единой таблицы? Зачем вы приплели сюда понятие «получится»? Удобно и комфортно работать с этим, если для разных по смыслу и функциональности понятий будут выделены отдельные сущности и таблицы. Не удобно и не комфортно, трудносопровождаемо это будет сделать на одной, но если человек не может пользоваться мозгом, то ему нечего делать в разработке, пусть идёт лопатой машет. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2017, 10:57 |
|
|
start [/forum/search_topic.php?author=formatov&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
164ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
others: | 444ms |
total: | 749ms |
0 / 0 |