» »

[SQL] Ali je možno postavit UNIQUE index po grupah?

[SQL] Ali je možno postavit UNIQUE index po grupah?

HotBurek ::

Dobro jutro.

Zanima me, če obstaja indeks, ki bi bil unique po grupah za kombinacijo word-ov.

Primer tabele:

g | w
-------
0 | 0
0 | 1
0 | 2
1 | 0
1 | 1


Se pravi index, ki bi za vsako groupo g poskrbel, da se memberji w ne ponovijo (ne glede na zaporedje).

In v zgornjem primeru je vse ok.


Za primer spodnje tabele, pa bi vrnil error, ker se wordi groupe 2 ([0,2,1]) ponovijo v groupi 0 ([0,1,2]).

g | w
-------
0 | 0
0 | 1
0 | 2
1 | 0
1 | 1
2 | 0
2 | 2
2 | 1



Se da postavit tak index?


Naštudirano imam sicer backup rešitev, kjer bi vnesel vse memberje po vrsti naraščajoče:

g | index
------------
0 | 0_1_2
1 | 0_1

S tem, da bi moral pazit, da ne vnesem 0_2_1...
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
  • spremenilo: HotBurek ()

no comment ::

Ne.

Bi pa lahko to preprečil s triggerjem.

z0mbie ::

constraint cnst_gw unique (g,w)

spustil si glavno zadevo in to je katero bazo uporabljas. Nimajo vse vsega.
That, in its essence, is Fascism - ownership of Government by an
individual, by a group, or by any other controlling private power.
Franklin D. Roosevelt v posmeh Tomažu Štihu

Zgodovina sprememb…

  • spremenilo: z0mbie ()

showsover ::

op želi enoličnost zaporedja, ne za enoličnost zapisov samih po sebi

WhiteAngel ::

Tisti 0_1_2 backup način izgleda kar pravi. Če imaš konstantno mnogo w, potem lahko tudi zakodiraš z biti, kjer je indeks bita w. Torej 001 je 1, 010 je 2, 100 je 3, 110 je 2 in 3...

HotBurek ::

z0mbie, baza je MariaDB. In primer unique(g,w) mislim, da ne bi rešil problema. Kaj, če se g spremeni, w pa ostane isti?

gtfo, ravno zaporedje ni pomembno, zgolj kateri memberji so notri.

WhiteAngle, w bo 1, 2 in 3.


V osnovi gre za tabelo, kjer bodo generirane kombinacije iz osnovnih word-ov (kisla, smetana, 500g)... za autocomplete.

Za primer:
kisla smetana 500g
smetana kisla 500g
kisla 500g smetana
smetana 500g kisla
500g kisla smetana
500g smetana kisla


Zgoraj so vse kombinacije treh word-ov, in vse morajo spadat pod eno grupo, iz katere pa bo v autocomplete prikazan samo eden, najbolj primeren text (glede na input string). S tem se znebi vse solate, ki je bojl ali manj "ista" (a+b+c=a+c+b=b+c+a=...).


Primer za iskalni niz: 500g k

Vrne:
500g kisla
500g kisla smetana

Ne pa tudi:
smetana 500g kisla

Ker je member iz iste grupe že bil izbran/prikazan.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Zgodovina sprememb…

  • spremenilo: HotBurek ()

showsover ::

Zaporedje je pomembno za poenostavljeno primerjanje, da ni vsakič potrebno vsega item po item preverjati. Kako pa hočeš dati unique constraint sicer na tvojo backup rešitev?
0_1_2
0_2_1
1_0_2
1_2_0
2_0_1
2_1_0
Brez določenega zaporedja (naraščajočega ali padajočega) so to različne množice, ti pa tega NAJBRŽ nočeš, ali pač?

Zgodovina sprememb…

  • spremenilo: showsover ()

HotBurek ::

Kako se bo index imenoval, je načeloma vseeno. Lahko je tudi čšž...


Glavno je, da (isti wordi v različnem zaporedju) spadajo v svojo grupo, kjer je potem možno naredit GROUP BY. Kako poimenovat je vseeno, a eden od lažjih načinov je, da se memberje zlista po id-jih in se jih zapiše naraščajoče, z vmesnim _ znakom. In to potem postane ime grupe.


Tabela word-ov:
14|kisla
57|smetana
40|500g

Tabela kombinacij:
00|kisla smetana 500g|ž|14_40_57
01|smetana kisla 500g|ž|14_40_57
02|kisla 500g smetana|ž|14_40_57
03|smetana 500g kisla|ž|14_40_57
04|500g kisla smetana|ž|14_40_57
05|500g smetana kisla|ž|14_40_57
06|kisla smetana|č|14_57
07|smetana kisla|č|14_57
08|500g smetana|š|40_57
09|smetana 500g|š|40_57
10|500g kisla|ć|14_40
11|kisla 500g|ć|14_40
12|smetana|đ|57
13|kisla|x|14
14|500g|y|40


Prvi stolpec: id
Drugi stolpec: kombinacija word-ov
Trejti stolpec: en primer poimenovanja grupe
Četrti stolpec: i think d best primer poimenovanja grupe


Ali se index imenuje ž ali 14_40_57 je vseeno. Predvidevam pa, da je za lažje delo z podatki boljši drugi primer.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

showsover ::

HotBurek, jaoj, ne gre za 'ime' indexa ali constrainta ampak za konkatenirano vrednost (se pravi seznam, katerega enoličnost hočeš), pa saj si še ti v uvodnem postu napisal.

Naštudirano imam sicer backup rešitev, kjer bi vnesel vse memberje po vrsti naraščajoče:


Kaj ti ni jasno, ne vem.
Če vzameš zaporedje 0,2,1 ali 1,0,2 ali 2,1,0... Vse to so izpeljave zaporedja 0,1,2. In temu (menda) hočeš vsiliti enoličnost (je to sicer neobičajna praksa ampak izgleda ena najlažjih rešitev za ta tvoj problem). In pač vse posortiraš (ker je to ena najlažjih operacij), ko sestaviš seznam, ki ga primerjaš, da s tem najlažje ugotoviš, če se ti množica ponavlja in pripišeš tole zaporedje.

Ime? Pa koga briga ime. Zaradi mene je lahko ime 'HotBurek_Superior_Backup_Solution', jaz ga sploh ne omenjam.
Sicer pa, kaj me briga, če se že ti pri tako enostavnih stvareh lovimo in je treba 10x razlagati...
Ali pa drugače formulirati vprašanje.

Zgodovina sprememb…

  • spremenilo: showsover ()

HotBurek ::

Id member-jev bi razvrstil naraščajoče, med njimi dal _, ter to zapisal kot ime grupe. S tem bi padli v ustrezno grupo.

Zaporedja memberjev kot so zapisani ne bi spreminjal.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Zgodovina sprememb…

  • spremenilo: HotBurek ()

showsover ::

HB, mogoče se vendarle razumemo. :-) Boš (enostaven, brez wildcardov) uporabnikov query na enak način 'zakodiral' in potem iskal po bazi za zadetke ali kako boš to uporabil? Boš uporabil logične operatorje (ali, in, brez, ne, oklepaji ali brez) za iskanje po 'nezaporedju' ali to ne pride v poštev?

Zgodovina sprememb…

  • spremenilo: showsover ()

WhiteAngel ::

showsover je izjavil:

se pravi seznam, katerega enoličnost hočeš


Ni seznam, ampak množica.

Hotburek verjetno hoče enum podatkovni tip?

showsover ::

Množica v smislu sortiranega seznama v indeksiranem tekst polju, delimitanega z _ (ali s čim že), ja, za lažjo obdelavo, normalno. Koliko bo najdaljša množica (v seznamu vrednosti) ne vem, to bo že HB urejal, menda, to hoče v bazi, elementi seznama so pa id-ji besed. Performanse so vprašljive, bo že drugo temo odprl takrat.

Zgodovina sprememb…

  • spremenilo: showsover ()

HotBurek ::

Želja je, da ko bo uporabnik vtipkal "kisla", mu bo autocomplete vrnil po MAX ene element iz grupe.

Se pravi; "kisla smetana" ja, "smetana kisla" pa ne. Oba zapisa bosta del iste grupe.


Za iskanje sem do sedaj uporabljal NATURAL LANGUAGE MODE, in bom verjetno s tem tudi štartal.

Nepovezan primer:
SET @search_term = 'plezalne previs xx';

SELECT `id`,
	`name`,
	`price`,
	`price_currency`,
	MATCH(`name`) AGAINST(@search_term IN NATURAL LANGUAGE MODE) AS 'relevance'
FROM `product`
WHERE MATCH(`name`) AGAINST(@search_term IN NATURAL LANGUAGE MODE)
ORDER BY MATCH(`name`) AGAINST(@search_term IN NATURAL LANGUAGE MODE) DESC;
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Zgodovina sprememb…

  • spremenilo: HotBurek ()

galu ::

Najprej si preberi to: https://prefixy.github.io/
Tako to gre.

no comment ::

HotBurek je izjavil:


V osnovi gre za tabelo, kjer bodo generirane kombinacije iz osnovnih word-ov (kisla, smetana, 500g)... za autocomplete.

Za primer:
kisla smetana 500g
smetana kisla 500g
kisla 500g smetana
smetana 500g kisla
500g kisla smetana
500g smetana kisla

Na tak način ne boš naredil autocomplete-a.

Vsaj ne takega, ki bi ga kazal naokrog...

</head> ::

Njavečji problem je, ker Bureku rešujete njegovo idejo, v resnici pa še ni povedal, kaj zares dela.

Če delaš tole za vajo, pol OK, če pa želiš nekje implementirat autocomplete, je pa tole čist zgrešen pristop.

</head> ::

Hint: Ne se sekirat, če ima SQL tabela mal več entrijev. SQL tablea preživi par miljonov entrijev brez večjih težav. Pač naredi unique v selectu, pa boš dobil želen rezultat.

Ampak vseeno se ne bi tako loteval autocompleta, ker je autocomplete že rešen problem. Uporabiš eno implementacijo in čao.

HotBurek ::

Edino, kar se sekiram je, kako naj to (iskalnik po produkih trgovin) poimenujem.

Tehnični izzivi, katere ne bom znal, bodo mogoče privabili koga, ki to zna. Itak se dela iz nule.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

kuall ::

Namen indexov je pohitritev, ne pa neko preverjanje.
Za to imaš CHECK constraint. Ali se da s CHECK contraint doseč kar hočeš je pa drugo vprašanje, če ne to pa s triggerji.

kuall ::

Zgleda, da se da:
drop table burek 
go

alter FUNCTION dbo.fnBurekCheck (
  @w int, @id int
)
RETURNS BIT
AS
BEGIN
  
  -- tukaj sedaj nastopi burek!!!
  IF EXISTS(SELECT * FROM burek WHERE w=@w and @id <> id)
    return 0 

   return 1  
END

go


create table burek (id int identity, g int, w int)

ALTER TABLE burek ADD CONSTRAINT myCheckConstraint CHECK(dbo.fnBurekCheck (w, id) = 1);

insert into burek (g, w) values (1, 1)

insert into burek (g, w) values (1, 1) -- error

select*from burek

Spura ::

Za neke tekst searchboxe uzames kak temu namenjen produkt namesto da to na bazi resujes. Eliminacijo podobnih rezultatov se lahko tut na serverju gres, ni treba da je reseno na bazi.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Substitut za sladkarije (strani: 1 2 )

Oddelek: Loža
753499 (676) Snegec
»

Aparat za peko kruha (strani: 1 2 )

Oddelek: Loža
7621820 (2048) zuz3k
»

Kako pomnožiti probiotike doma?

Oddelek: Loža
425516 (1498) fosil
»

Omaka za filane parike-kako jo izbolšati?

Oddelek: Loža
141810 (1197) shadowfax
»

Recepti in slike tega, kar so ustvarile vaše roke in domišljija :)

Oddelek: Sedem umetnosti
2212144 (8235) St@jler

Več podobnih tem