|
|
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Добрый день! Подскажите плз какой из двух вариантов ведения истории значения поля лучше выбрать: Вариант1: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Что лучше и эффективней использовать? Вариант1 быстрее для вставки и удаления записей, Вариант2 для выборок? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 18:52 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Novice22 Код: plaintext 1. Уже неоднократно обсуждалось, что чревато пытаться достичь уникальности на основе даты (даже со временем). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 19:00 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
miksoftNovice22 Код: plaintext 1. Уже неоднократно обсуждалось, что чревато пытаться достичь уникальности на основе даты (даже со временем). А можно ссылку на посты, где это обсуждалось, плз. А то при поиске как лучше организовать хранение изменений поля у меня наоборот сложилось впечатление, что этот вариант лучший :/ . http://rdbms.narod.ru/article/history/index.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 19:10 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Novice22 пишет: > Tovar( > id int, > type varchar(*50*) > ) > Tovar_history( > id, FK(Tovar.id), > DateStart, > DateEnd, > Name > ) > id+DateStart - PK Tovar_history > > > Что лучше и эффективней использовать? 2-ой однозначно. Первый ты почти не сможешь обрабатывать запросами. Т.е. сможешь, но очень сложно. К тому же это нереляционно - данные в одной записи неявно зависят от данных в другой записи, поскольку дата начала действия (или конца) записи лежит в данной записи, а дату конца (или соотв. начала) действия данной записи ты можешь узнать, только найдя не самым простым запросом последующую (или соотв. предыдущую ) запись. (на самом деле конечно не такой он и сложный, но если его вложить в другие запросы которые уже реально с данными работать будут, будет совсем невесело). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 19:32 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Novice22, а между диапазонами разрывы могут быть? Т.е. может ли так оказаться, что между DateEnd одной записи и DateStart другой записи ничего не будет.? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 19:38 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZivК тому же это нереляционноА дублировать (и не просто дублировать, а следить за непересечением и неразрывностью интервалов) данные лучше, что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 19:41 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZiv Первый ты почти не сможешь обрабатывать запросами. В первом варианте относительно запросов я вижу пока только одну проблему: каким образом отсекать, что с даты n история временно перестала вестись. Например: Код: plaintext 1. 2. 3. Может понадобится "свернуть" историю по Товару с id = 1 с 30.05 он временно перестал выпускаться/покупаться/завозиться. Единственное, что пока придумалось добавление еще одной записи с пустым наименованием и датой, когда история временно прекращена. miksoft а между диапазонами разрывы могут быть? Пересечений быть не должно разрывы могут. Товар может какое-то время отсутствовать по разным причинам на предприятии, на это время нужно прекратить вести историю, после появления товара историю нужно продолжить с даты появления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 20:17 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Novice22Товар может какое-то время отсутствовать по разным причинам на предприятии, на это время нужно прекратить вести историю, после появления товара историю нужно продолжить с даты появления.А тогда как вы вообще собирались применять первый вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 20:28 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
miksoftА тогда как вы вообще собирались применять первый вариант? Путем вставки записей с пустым наименованием и датой Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. Это мой первый опыт самостоятельного проектирования базы и работы с историей, прочитав сообщения на форуме возможная реализация представляется мне в качестве одного из этих 2х вариантов. Теперь я пытаюсь определить, что из них лучше и выбрать оптимальное решение. Пока складывается ощущение, что второй вариант лучше по реализации(простоте) select, но более громоздкий для insert/delete (при вставке/удалении не последнего значения надо изменять даты у "соседних записей"), первый наоборот. Или я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 21:03 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZivК тому же это нереляционно - данные в одной записи неявно зависят от данных в другой записи, поскольку дата начала действия (или конца) записи лежит в данной записи, а дату конца (или соотв. начала) действия данной записи ты можешь узнать, только найдя не самым простым запросом последующую (или соотв. предыдущую ) запись.Ничуть. Скорее, такая зависимость есть именно во втором случае. В первом случае, данные в одной записи никак не зависят от данных в другой записи, во всех записях дата начала точки отсчета. А вот во втором случае, данные в одной записи как раз зависят от данных в другой записи, так как подразумевается, если я правильно понял, непересекающиеся промежутки. И если меняем, например, дату конца периода в первой записи, то обязательно надо корректировать дату в следующей, второй по порядку, записи. Хуже того, при неверном указании даты окончания в одной записи, все последующие могут оказаться в противоречивом состоянии, когда дата их окончания неожиданно станет меньше даты окончания первой записи. Но и это еще не все, во втором случае еще и появляется зависимость между полями. Значение в одном из них обязательно должно превышать значение в другом, и наоборот. Таким образом, именно второй случай следует считать проявлением нереляционности, а точнее, денормализации, выполняемый с целью оптимизации некоторых видов запросов. P.S. То, что любой факт должен меняться только в одном месте, является косвенным признаком нормальности решения модели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2008, 22:47 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
2 ChA ChAMasterZivК тому же это нереляционно - данные в одной записи неявно зависят от данных в другой записи, поскольку дата начала действия (или конца) записи лежит в данной записи, а дату конца (или соотв. начала) действия данной записи ты можешь узнать, только найдя не самым простым запросом последующую (или соотв. предыдущую ) запись.Ничуть. Скорее, такая зависимость есть именно во втором случае. В первом случае, данные в одной записи никак не зависят от данных в другой записи, во всех записях дата начала точки отсчета. А вот во втором случае, данные в одной записи как раз зависят от данных в другой записи, так как подразумевается, если я правильно понял, непересекающиеся промежутки. И если меняем, например, дату конца периода в первой записи, то обязательно надо корректировать дату в следующей, второй по порядку, записи. Хуже того, при неверном указании даты окончания в одной записи, все последующие могут оказаться в противоречивом состоянии, когда дата их окончания неожиданно станет меньше даты окончания первой записи. Но и это еще не все, во втором случае еще и появляется зависимость между полями. Значение в одном из них обязательно должно превышать значение в другом, и наоборот. Таким образом, именно второй случай следует считать проявлением нереляционности, а точнее, денормализации, выполняемый с целью оптимизации некоторых видов запросов. P.S. То, что любой факт должен меняться только в одном месте, является косвенным признаком нормальности решения модели. С таким же успехом можно сказать, что в первом случае существует зависимость между любыми соседними записями, так как дата в предыдущей должна быть меньше, чем в последующей. Но мне кажется, что подобные зависимости, как в первом, так и во втором случае являются надуманными. Т.е. зависимости конечно есть, но их наличие не означает, что данное решение плохое. Например, в таблице с полями Пол, Беременность, второе поле для женщин может принимать значения TRUE или FALSE, а для мужчин - NULL, следовательно можно говорить, что поля Беременность и Пол находятся в зависимости. Что в этом плохого? > Хуже того, при неверном указании даты окончания в одной записи, все последующие могут оказаться в противоречивом состоянии В противоречивом состоянии могут оказаться и записи из первой схемы. Но как в первом, так и во втором случае такие состояния не должны возникать в штатном режиме работы программы. > То, что любой факт должен меняться только в одном месте, является косвенным признаком нормальности решения модели. Это, конечно, в пользу первого варианта. Я уже было решил, что буду использовать второй вариант, но теперь увидев эту тему и Ваш ответ засомневался в правильности выбора. В свое время Вы написали примеры запросов ко второму варианту. См.: http://sql.ru/forum/actualthread.aspx?tid=599398 Не могли бы Вы написать, как будет выглядеть запрос для превого варианта? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 01:39 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
kordaС таким же успехом можно сказать, что в первом случае существует зависимость между любыми соседними записями, так как дата в предыдущей должна быть меньше, чем в последующей. Но мне кажется, что подобные зависимости, как в первом, так и во втором случае являются надуманными.Нельзя так сказать, потому что в первом варианте есть только дата начала. Если поменять эту дату, то просто измениться историческая последовательность. И она может быть верной. Нет явной зависимости между записями. Нормализация не отвечает за Ваши умопостроения, она занимается только аномалиями данных и поиском функциональных зависимостей в модели данных. kordaНапример, в таблице с полями Пол, Беременность, второе поле для женщин может принимать значения TRUE или FALSE, а для мужчин - NULL, следовательно можно говорить, что поля Беременность и Пол находятся в зависимости. Что в этом плохого?Только то, что мужчина может оказаться беременным, а женщина - в неизвестном медицине состоянии. Вы можете использовать такое решение, но не удивляйтесь сюрпризам. В общем случае, это неправильный подход. kordaЯ уже было решил, что буду использовать второй вариант, но теперь увидев эту тему и Ваш ответ засомневался в правильности выбора. Можно использовать любой из этих вариантов, но второй будет явно сложнее реализовывать. Много телодвижений по проверке корректности. Зато запросы на конкретную дату будут чуть проще. В большинстве случаев, я бы предпочел 1 способ. kordaВ свое время Вы написали примеры запросов ко второму варианту. См.: http://sql.ru/forum/actualthread.aspx?tid=599398 Простите, но Вам не хотелось бы самому над этим поразмышлять ? Теория, это, конечно, хорошо, но без практики - толку от неё маловато. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 02:39 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
ChA Можно использовать любой из этих вариантов, но второй будет явно сложнее реализовывать. Много телодвижений по проверке корректности. Зато запросы на конкретную дату будут чуть проще. В большинстве случаев, я бы предпочел 1 способ. +1 Зачем усложнять себе жизнь? Если дата окончания Вам не нужна - не делайте так. У Вас же периоды не перекрываются! Для упрощения запросов сделайте sp/view с датой окончания периода. Второй вариант имеет право на существование только если периоды не будут редактироваться. А это маловероятно. Если будут - за&@&сь потом с проверкой корректности. Всегда лучше то решение, которое проще. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 08:23 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Michael_NChA Можно использовать любой из этих вариантов, но второй будет явно сложнее реализовывать. Много телодвижений по проверке корректности. Зато запросы на конкретную дату будут чуть проще. В большинстве случаев, я бы предпочел 1 способ. +1 Зачем усложнять себе жизнь? Если дата окончания Вам не нужна - не делайте так. У Вас же периоды не перекрываются! Для упрощения запросов сделайте sp/view с датой окончания периода. Второй вариант имеет право на существование только если периоды не будут редактироваться. А это маловероятно. Если будут - за&@&сь потом с проверкой корректности. Всегда лучше то решение, которое проще. :-) Выскажусь: Согласен вышесказанным: 1 вариант проще в заполнении, сложнее в выборках, проверок корректности (почти) не требует 2 вариант сложнее в заполнении, проще в выборках, требует проверок корректности данных при корректировке. Можно выбрать промежуточный вариант: структура - как во 2 варианте, но пользователь может корректировать только поле DateStart. Триггер пусть корректирует поле DateEnd в соответствующих записях. Результат: простота заполнения 1 варианта, простота выборок 2 варианта, отсутствие проверок корректности 1 варианта + триггер нада написать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 09:34 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
Ну и АВТОРу (начинает вроде): DateStart = NULL - значит - "от царя гороха" или испокон веков (кому как нравится) DateEnd = NULL - значит - пожизненно, т.е. всегда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 09:38 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuHНу и АВТОРу (начинает вроде): DateStart = NULL - значит - "от царя гороха" или испокон веков (кому как нравится) DateEnd = NULL - значит - пожизненно, т.е. всегдаДля выборок по индексу - очень неудачное решение. Имхо, лучше использовать константы, гарантированно выходящие за диапазон обрабатываемых данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 09:47 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
miksoft пишет: > А дублировать (и не просто дублировать, а следить за непересечением и > неразрывностью интервалов) данные лучше, что ли? Вы во-первых сами подняли тему о разрывах. Т.е. это не всегда и нужно. а во-вторых - да, ЛУЧШЕ следить за этим. Это делается в ОДНОМ запросе на изменение. А всё остальное надо делать во многих запросах на чтение. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 10:05 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZiv> А дублировать (и не просто дублировать, а следить за непересечением и > неразрывностью интервалов) данные лучше, что ли? Вы во-первых сами подняли тему о разрывах. Т.е. это не всегда и нужно. а во-вторых - да, ЛУЧШЕ следить за этим. Это делается в ОДНОМ запросе на изменение. А всё остальное надо делать во многих запросах на чтение. Следить за этим констрейнтами мало в какой СУБД получится. Если следить запросами - сложно и/или накладно уберечься от одновременной вставки в разных сессиях. Кроме того, существует вероятность невыполнения этой проверки. Имхо, лучше иметь надежные данные в базе и совершенстовать (исправлять ошибки) выборки, нежели наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 10:17 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
ChA пишет: > Ничуть. Скорее, такая зависимость есть именно во втором случае. В первом > случае, данные в одной записи никак не зависят от данных в другой > записи, во всех записях дата начала точки отсчета. Да зависимость-то есть в любом случае, если она есть в предметной области. Если один товар "сменяет" другой - они зависимы. Вопрос в том, как эту зависимость более удобно представить в БД. А вот во втором > случае, данные в одной записи как раз зависят от данных в другой записи, > так как подразумевается, если я правильно понял, непересекающиеся > промежутки. Там в обоих случаях либо есть эти промежутки, либо нет. Только в первом конец или начало промежутка находится в соседней записи. И если меняем, например, дату конца периода в первой записи, > то обязательно надо корректировать дату в следующей, второй по порядку, > записи. Ну, конечно вы правы. Тут можно покрасивее нарисовать, но будет немного сложнее. Но первый вариант совсем плохой. Ну т.е. запросы будут сложные-- напишите запросы реальные, попробуйте. Хуже того, при неверном указании даты окончания в одной записи, > все последующие могут оказаться в противоречивом состоянии, когда дата > их окончания неожиданно станет меньше даты окончания первой записи. Но и > это еще не все, во втором случае еще и появляется зависимость между > полями. Значение в одном из них обязательно должно превышать значение в > другом, и наоборот. Таким образом, именно второй случай следует считать > проявлением нереляционности, а точнее, денормализации, выполняемый с > целью оптимизации некоторых видов запросов. вы во-первых путаете денормализацию и ненормализованность, а во-вторых, говорите вообще ерунду. Кортежи нормализуются независимо друг от друга - вся таблица целиком нормализуется. Функциональная зависимость-- это отношение между полями таблицы. У КАЖДОГО товара должен быть срок его действия. Есть товар. Есть о нём запись в таблице(ах). Все данные ЭТОГО товара должы быть самодостаточными для приложения. Все остальные товары я могу удалить напр. Вот понадобится мне почистить эту таблицу истории -- и КАК ? Последнюю запись перед первой удаляемой придётся оставить, так ? Придётся. Но она БУДЕТ НЕВАЛИДНОЙ, потому что срок начала её действия будет находится в предыдущей удалённой записи. Тут пример немного надуманный, правда, потому что можно считать дату в записи датой начала действия записи, и тогда всё как бы в порядке. Но в общем это всё равно - с такими проблемами вы всегда будете встречаться, если будете раскладывать данные одной записи по нескольким. > P.S. То, что любой факт должен меняться только в одном месте, является > косвенным признаком нормальности решения модели. Нет. Здесь нет никакой ненормальности. Это -- бизнес логика в чистом виде -- вам нужно чтобы периоды сроков действия товаров не пересекались. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 10:22 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
korda пишет: > Я уже было решил, что буду использовать второй вариант, но теперь увидев > эту тему и Ваш ответ засомневался в правильности выбора. > В свое время Вы написали примеры запросов ко второму варианту. См.: > http://sql.ru/forum/actualthread.aspx?tid=599398 > Не могли бы Вы написать, как будет выглядеть запрос для превого варианта? вот именно. Надо написать список нужных запросов и попытаться реализовать их в двух вариантах. Потом посмотреть, какой лучше. Я вас уверяю, второй выиграет. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 10:24 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
miksoft пишет: > Для выборок по индексу - очень неудачное решение. Имхо, лучше > использовать константы, гарантированно выходящие за диапазон > обрабатываемых данных. Да не пугайте народ. Ничего страшного. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 10:26 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
KOT MATPOCKuH пишет: > Можно выбрать промежуточный вариант: структура - как во 2 варианте, но > пользователь может корректировать только поле DateStart. Триггер пусть > корректирует поле DateEnd в соответствующих записях. Результат: простота > заполнения 1 варианта, простота выборок 2 варианта, отсутствие проверок > корректности 1 варианта + триггер нада написать. Так , стоп. Тут надо разобраться периоды могут пересекаться, или нет. Если могут - тогда их вообще редактировать свободно можно и не будет никакой логики непересечения. Если не могут, то вопрос, будут ли дырки или нет. Если нет, то это вообще бизнес-операция должна быть - замена одного товара на другой. Ставим в старом дату конца, ставим в новом дату начала +1 день. Вообще, ещё раз, это бизнес-логика в чистом виде. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 10:29 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZiv miksoft пишет: > Для выборок по индексу - очень неудачное решение. Имхо, лучше > использовать константы, гарантированно выходящие за диапазон > обрабатываемых данных. Да не пугайте народ. Ничего страшного. Тогда придется писать Код: plaintext 1. Хотя, если записей сто штук, то, конечно, ничего страшного... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 10:45 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZiv ... Тут надо разобраться периоды могут пересекаться, или нет. ... Не могут однозначно, т.к. это история значения некоторого параметра. Одновременно не может быть двух значений у параметра (если только значение параметра не является списком, но это - другая история). MasterZiv ... будут ли дырки или нет? ... Во-первых: сам автор уже ответил на этот вопрос - вполне нормально. Только смысла в дырках я не вижу. Функциональность отвечает (я так понял) только за историю значения параметра. Отсутствие значения однозначно всеми (мне известными) СУБД реализовано одним способом: значение = NULL, что в некотором смысле - тоже значение (в нашем случае строка в таблице истории). Отсутствие же доступа к параметру решается не на этом уровне, т.е. не этими сущностями, а попытка в одну сущность впихнуть несколько разных функциональностей еще никогда не приводила к хорошему результату. Пример последнего: если с 01.01.2008 по 10.01.2008 небыло сковородок, то значение цены на сковородки должно существовать (старое, например), только показывать его смысла нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 12:29 |
|
||
|
История одна дата vs две. Что лучше?
|
|||
|---|---|---|---|
|
#18+
MasterZiv Вообще, ещё раз, это бизнес-логика в чистом виде. Вопросы, задаваемые в этом форуме редко относятся только к структуре БД. Большей частью требуется подсказать вариант бизнес-логики и уже под нее структуру БД. Даже если некто спрашивает про структуру, то отвечающие обычно пытаются догадаться о его бизнес-логике и ответить на вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2008, 12:34 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35650525&tid=1543554]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
169ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
94ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 539ms |

| 0 / 0 |
