SQL databáze s tagy   zodpovězená otázka

SQL, Databáze

Dobrý den,

potřeboval bych pomoci se strukturou SQL databáze, ve které se využívají tagy. Konkrétně potřebuji vytvořit strukturu ovládanou přes VB, kde uživatel vytváří příspěvky, které může označit vlastnoručně vytvořenými tagy, pod kterými tyto články zpětně hledá.

Jsem začátečník v SQL a prosím o pomoc.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Předpokládám, že existující tagy se budou nabízet u nových příspěvků (i když půjde případně založit nový).

Pak bych to řešil standardně jako tabulku příspěvků, tabulku tagů a mezi nimi vazební N:N tabulku tj.

Prispevek:
IDPrispevku (PK)
Text
...

Tag:
IDTagu (PK)
Oznaceni

Prispevek_Tag:
IDPrispevku (PK, FK)
IDTagu (PK, FK)
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak tady bych mel jen jeden upresnujici dotaz: Mohlo by ono IDTagu v Prispevek_Tag byt array? Nebo se to resi jinak -> Pro nekolik tagu u jednoho prispevku?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V SQL žádné array není.

Toto je standardní řešení N:N vazby (příspěvek může mít více tagů a jeden tág je možné použít u více příspěvků). Pro každou kombinaci vzájemně svázaných IDPrispevku a IDTagu bude právě existovat záznam ve vazební tabulce Prispevek_Tag.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já mám k tomu doplňující dotaz.

Co když bude více "věcí" ke kterým se dají přilepit tagy?

Kromě příspěvku který může být otagován, tak třeba i fotka?

Pak by to vypadlo následovně

Prispevek:
IDPrispevku (PK)
Text
...

Fotka:
IDFotky (PK)
Url
...
 
Tag:
IDTagu (PK)
Oznaceni
 
Prispevek_Tag:
IDPrispevku (PK, FK)
IDFotky (PK, FK)
IDTagu (PK, FK)

???

Když by tag vycházel z fokty, tak by IDPrispevku ve smíšené tabulce bylo null...

Je to tak správný přístup, nebo jak takovouto věc řešit?

(nejlépe s použitím EF)

Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takto by vám to udělat nešlo.

Musel by jste ve vazební tabulce povolit IDPrispevku a IDFotky NULL, pro PK zavést vlastní ID (protože NULL sloupec nemůže být součástí PK), doplnit UNIQUE constraint na trojici IDPrispevku, IDFotky a IDTagu a doplnit CHECK contraint, že je vyplněné právě jedno z IDPrispevku a IDFotky.

TagPrirazeni:
IDTagPrirazeni (IDENTITY PK)
IDPrispevku NULL (U, FK)
IDFotky NULL (U, FK)
IDTagu (U, FK)

CK: (IDPrispevku IS NOT NULL AND IDFotky IS NULL) OR (IDPrispevku IS NULL AND IDFotky IS NOT NULL)

Pokud ale víte, že tagovatelných objektů bude do budoucna přibývat, tak by to bylo lepší modelovat jako dědičnost:

Objekt:
IDObjektu (IDENTITY  PK)

Prispevek:
IDPrispevku (PK)
IDObjektu (FK, U) - vazba 1:1 na Objekt
Text
...

Fotka:
IDFotky (PK)
IDObjektu (FK, U) - vazba 1:1 na Objekt
Url
...
  
Tag:
IDTagu (PK)
Oznaceni (U)

Objekt_Tag:
IDObjektu (PK, FK)
IDTagu (PK, FK)

Při založení příspěvku nebo fotky by se pak vždy založil (nejprve) i záznam do tabulky Objekt.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback