2010-09-16 8 views
9

Ho 3 piani:Come progettare lo schema per qualcosa di simile a tag domande StackOverflow?

1, nella tabella di domande:

question 
------------------------------------ 
id title content ...  tags 
------------------------------------ 
1 aaa  bbb  ...  tag1,tag2,tag3 (use , to split more tags) 

2, nella tabella di tag e spaccato:

tags 
------------------------------------ 
id tag 
------------------------------------ 
1 tag1,tag2,tag3 (use , to split more tags) 

3, nella tabella tag:

tags 
------------------------------------ 
id tag 
------------------------------------ 
1 tag1 
2 tag2 
3 tag3 

Penso che il piano 3 sia migliore, ma qual è la tua opinione?

Altre buone idee per questa implementazione?

Grazie per l'aiuto :)

+2

Si prega di vedere [ Come si consiglia di implementare tag o codifica ] (http://stackoverflow.com/questions/20856/how-do-you-recommend-implementing-tags-or-tagging). –

risposta

12

Questi modelli sono chiamati mysqlicious, scuttle e toxi (dal minimo al più normalizzato).

Tutti hanno i loro vantaggi e svantaggi. Si può leggere una buona analisi del tutto qui:

http://forge.mysql.com/wiki/TagSchema (WayBackMachine Version)

Nota che mysqlicious dipende fortemente la capacità del database per eseguire in modo efficiente FULLTEXT ricerche.

Ciò significa che per MySQL con InnoDB e per altri sistemi è molto poco pratico.

1

dipende da come normalizzata volete che i vostri dati siano.

In primo luogo, rabbrividisco quando vedo una colonna "id" in una tabella che non è univoca. Almeno rinominare la colonna in "question_id".

In secondo luogo, dipende se si desidera un elenco rapido di tutti i tag definiti. In questo caso, vorresti una tabella di tag separata che definisca l'insieme di possibili tag e quindi una tabella intermedia tra domande e tag che fornisca un'associazione many-to-many.

6

La relazione tra tag e contenuto è many-to-many. Ciò significa che un tag può essere associato a diverse unità di contenuto e un'unità di contenuto può essere associata a più tag.

Per implementare questo in un database, è possibile utilizzare una tabella ausiliaria denominata ContentTags. La relazione di Content a ContentTags è uno-a-molti; la relazione di Tags a ContentTags è uno-a-molti.

#Tags Table 
Id Text 
1 'Tag1' 
2 'Tag2' 
3 'Tag3' 


#Content Table 
Id Content 
1 "some content" 
2 "other content" 
3 "more content" 

#ContenTags Table 
ContentId TagId 
1   1 
1   2 
2   1 
2   2 
2   3 
3   1 

Come si può vedere, il rapporto si riflette chiaramente (contenuto 1 è associato con le etichette 1 e 2; contenuti 2 è associato con i tag 1, 2, e 3; contenuti 3 è associato solo con tag 1)

1

L'approccio corretto consiste nel creare le relazioni one-many, ovvero si dispone di un commento e più tag.Da WIKI

Nella tecnologia di database, le relazioni one-to-many (anche conosciute come a molti) si verificano quando un'entità è correlata a molte occorrenze in un'altra entità. Ad esempio, un club ha molti membri.

E il concetto principale nella progettazione del database è Database normalization.

Quindi lo farei così.

comments 
------------------------------------ 
id_comment title content 
------------------------------------ 
12   aaa  bbb 

tags 
------------------------------------ 
id_tag comment_id tag 
------------------------------------ 
1  12   tag1 
2  12   tag2 
3  12   tag3 
+0

Questo tipo di design avrà ** molta ridondanza ** nel tag ** archiviato ** perché molti commenti condividono gli stessi tag. Ad esempio, potremmo avere 1 milione di commenti taggati "tag1". A proposito, se accetto la ridondanza, vedo un altro problema: non è utile inserendo ** id_tag ​​** e ** tag ** contemporaneamente nella tabella ** tag **. Abbiamo solo bisogno di tag, ** non serve id_tag ​​se questa tabella ha già comment_id **. –

Problemi correlati