BG Development


  Reply to this topicStart new topicStart Poll

> Създаване на Ограничение за уникален Активен запис
Lachezar
  Публикувано на: 05-02-2021, 15:05
Quote Post



Име: Лъчезар Добрев
Група: Потребител
Ранг: Почетен член

Мнения: 2739
Регистриран на: 10.11.04



В таблица искам да имам много записи, които да се държат за историческа достоверност, но само един от тях да е текущо „активен“.
Примерно ако искам да държа информация за срещите ми по канадска борба. Искам в таблицата да са всички мачове, но само един от тях да е активен в момента.
Обновяването на таблицата може да става в силно агресивно-конкурентна среда, и е възможно множество клиенти да се опитат да въведат текущия мач едновременно, което искам да избегна.
Възможно е в таблицата да има много активни записи, но за различни ситуации, примерно за мен един активен мач, за друг състезател друг активен мач и т.н.

Не искам да разделям отделна таблица за историческите данни.

Не мога да синхронизирам външните клиенти.

Предложения?

Това, което на мен ми хрумва е да имам колона "active", в която да има стойност TRUE ако записа е активен, и NULL ако записа не е активен. Като се включи тази колона в UNIQUE CONSTRAINT, ще може да има много записи с NULL, но само един с TRUE. Негатива е, че ще може да има и един запис с FALSE в колоната, което не ме радва.


--------------------
И'м ватцхинг ъоу...
PMUsers Website
Top
dvader
Публикувано на: 05-02-2021, 18:14
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4918
Регистриран на: 12.07.05



За актуален резултат:
GROUP BY(Match), MAX(Date)

За многократни вмъквания на едно и също:
INSERT OR IGNORE


--------------------
I find your lack of faith disturbing
PM
Top
thrawn
Публикувано на: 05-02-2021, 18:36
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3076
Регистриран на: 17.01.17



Подходът ми се струва, че е грешен. Хистори данните не бива да се редактират (бизнес правило, все пак това са ти логовете).

За реализация на подобна схема ползвам таблица с активните записи. Когато запис стане неактивен се трие и с териер се записва в таблицата с историята. Самата таблица с историята е хубаво да е с партишън за да не се получават проблем с производителността след време.

Защо искаш да избегнеш тоя вариант?

Това мнение е било редактирано от thrawn на 05-02-2021, 18:38
PMEmail Poster
Top
DarkOne
Публикувано на: 05-02-2021, 20:53
Quote Post


Group Icon
Име: Александър Петков
Група: Администратор
Ранг: Почетен член

Мнения: 3579
Регистриран на: 30.01.04



QUOTE (Lachezar @ 05-02-2021, 15:05)
В таблица искам да имам много записи, които да се държат за историческа достоверност, но само един от тях да е текущо „активен“.
Примерно ако искам да държа информация за срещите ми по канадска борба. Искам в таблицата да са всички мачове, но само един от тях да е активен в момента.
Обновяването на таблицата може да става в силно агресивно-конкурентна среда, и е възможно множество клиенти да се опитат да въведат текущия мач едновременно, което искам да избегна.
Възможно е в таблицата да има много активни записи, но за различни ситуации, примерно за мен един активен мач, за друг състезател друг активен мач и т.н.

Не искам да разделям отделна таблица за историческите данни.

Не мога да синхронизирам външните клиенти.

Предложения?

Това, което на мен ми хрумва е да имам колона "active", в която да има стойност TRUE ако записа е активен, и NULL ако записа не е активен. Като се включи тази колона в UNIQUE CONSTRAINT, ще може да има много записи с NULL, но само един с TRUE. Негатива е, че ще може да има и един запис с FALSE в колоната, което не ме радва.

Ти пък един проблем си намерил.
SQL
CHECK (ACTIVE IS NULL OR ACTIVE = TRUE)
Много по-големи ядове от този ще береш с тази структура.

Това мнение е било редактирано от DarkOne на 05-02-2021, 20:53


--------------------
The man who learns only what others know
is as ignorant as if he learns nothing.
The treasures of knowledge are the most rare,
and guarded most harshly.
-- Chronicle of the First Age
PMICQ
Top
dvader
Публикувано на: 06-02-2021, 07:53
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4918
Регистриран на: 12.07.05



Я дай едни примерни данни, че така само гадаем какво точно искаш.


--------------------
I find your lack of faith disturbing
PM
Top
thrawn
Публикувано на: 06-02-2021, 08:01
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 3076
Регистриран на: 17.01.17



Бе то май гледам само защо го иска баш така.

Между другото, като казах, че е ясно, се сетих, че не ми стана ясно каква е тая идея с булевата стойност (която се иска) и изкуствено добавената стойност null.
Струва ми се, че в таблицата няма да има само един активен запис (среща по канадска борба) а ще има много (среща по джудо, икебана icon_smile.gif, канадска борба) което значи, че ключът задължително трябва да е съставен за да може да се ползва unique за активните записи. А това значи, че няма да има проблем и със стойността false при неактивните, което прави null излишна.

Това мнение е било редактирано от thrawn на 06-02-2021, 08:29
PMEmail Poster
Top
rosko
Публикувано на: 06-02-2021, 11:22
Quote Post



Име: Ростислав Димитров
Група: Потребител
Ранг: Редовен член

Мнения: 398
Регистриран на: 28.03.05



Какви биха били плюсовете и минусите на следното:

-Добавяш колоната status, слагаш default value false и not null
-Правиш UNIQUE Cosntraints на база няколко колони (+статуса) , които да ти определеят уникалността на двубоя


--------------------
When Hell is full, the dead will walk the earth
PMEmail Poster
Top
wqw
Публикувано на: 06-02-2021, 13:01
Quote Post


Group Icon
Име: Владимир Висулчев
Група: VIP
Ранг: Почетен член

Мнения: 6249
Регистриран на: 10.06.04



QUOTE (Lachezar @ 05-02-2021, 15:05)
Не искам да разделям отделна таблица за историческите данни.

Направи тогава отделна таблица за *активните* данни :-)) Таблицата с history данни ще се има достатъчно неприятности с конкурентните клиенти, които ръгат един и същ event.

Принципно ако искаш да имаш active колона и да uniqify-неш примерно редовете по user_id, sport_id не я правиш nullable, а добавяш *филтриран* UNIQUE индекс така някак

CODE
CREATE UNIQUE INDEX ON MyTable(user_id, sport_id)
WHERE active = 1


. . . колкото и да е dubious този дизайн. Още нещо, примерно в MSSQL ако имаш UNIQUE индекс по него можеш да имаш *само* един ред с NULL -- go figure!

А може и едно view да пробваш със SELECT * FROM MyTable WHERE active = 1 и после ако ти харесва как се получава да го материализираш за performance.

cheers,
</wqw>


--------------------
PMEmail PosterUsers Website
Top
Lachezar
  Публикувано на: 08-02-2021, 14:13
Quote Post



Име: Лъчезар Добрев
Група: Потребител
Ранг: Почетен член

Мнения: 2739
Регистриран на: 10.11.04



QUOTE (wqw @ 06-02-2021, 13:01)
Направи тогава отделна таблица за *активните* данни :-)) Таблицата с history данни ще се има достатъчно неприятности с конкурентните клиенти, които ръгат един и същ event.

Разделянето усложнява. „Ни щъ.“

QUOTE (wqw @ 06-02-2021, 13:01)
Принципно ако искаш да имаш active колона и да uniqify-неш примерно редовете по user_id, sport_id не я правиш nullable, а добавяш *филтриран* UNIQUE индекс така някак

CODE
CREATE UNIQUE INDEX ON MyTable(user_id, sport_id)
WHERE active = 1

Това свърши работа в Postgres! И е точно това, за което питам.
Стандартен SQL ли е това, или е някакво разширение, за което трябва да се оглеждам?

QUOTE (wqw @ 06-02-2021, 13:01)
. . . колкото и да е dubious този дизайн. Още нещо, примерно в MSSQL ако имаш UNIQUE индекс по него можеш да имаш *само* един ред с NULL -- go figure!

Да, наистина странно. Работя с Azure MSSQL, но до сега не ми се е случвало да попадна в такава дупка.
Решението с CREATE UNIQUE INDEX ... WHERE ... изглежда ще работи и с MSSQL.

@wqw: мерси.


--------------------
И'м ватцхинг ъоу...
PMUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0