2009-09-26 12 views
7

Chciałbym nieco więcej wyjaśnienia na temat metody zatruwania tagów w bazie danych toksykatów - wspomnianych gdzie indziej na piśmie.Przechowywanie znaczników w bazie danych. Przechowuj tag raz lub wiele razy?

Schemat bazy danych:

Table: Item 
Columns: ItemID, Title, Content 

Table: Tag 
Columns: TagID, Title 

Table: ItemTag 
Columns: ItemID, TagID 

Prawdopodobnie jest to głupie pytanie (ale nie znam odpowiedzi) ... Gdyby każdy wpis w tabeli Tag, posiadają unikalny tytuł. tzn. przechowuję tag tylko raz lub przechowuję go za każdym razem, gdy go używam?

Aby to zilustrować, która z tych dwóch tabelach należy skończyć z:

TagID  Title 
1   Fish 
2   Cat 
3   Dog 

lub

TagID  Title 
1   Fish 
2   Fish 
3   Cat 
4   Fish 
5   Dog 
6   Cat 

przypadku korzystania z pierwszej tablicy przed wejściem znacznik ja najpierw uruchomić i instrukcja SQL, aby dowiedzieć się, czy istnieje, prawda?

Każda pomoc zostanie doceniona. Ostatnio spłonęły mi palce z powodu zhakowania i indeksowania, chcę zacząć poprawiać podstawy.

+0

W drugim rozwiązaniu tak naprawdę nie potrzebujesz tabeli znaczników, po prostu zapisz znacznik w tabeli ItemTag zamiast TagID. Używałbym jednak pierwszego rozwiązania. – Vertigo

Odpowiedz

4

Podstawy są takie, że musisz przechowywać znaczniki, które wyświetlasz w pierwszym przypadku. Dobrze jest sprawdzić, czy istnieje tag (ponieważ w drugim przypadku dla istniejących tagów twoja db zwróciłaby tyle wierszy, ile jest tych wyglądów tagu) i dobra do pobierania elementów według tagów (wybór id elementu o jeden identyfikator jest lepszy niż wybór elementu Id przez zestaw tag_id, który ma takie samo znaczenie reprezentacyjne).

Jeśli paliłeś z powodu indeksowania - zawsze powinieneś sprawdzić, w jaki sposób wykonywane jest zapytanie (dla mysql jest to EXPLAIN/DESCRIBE SELECT).

2

Jeśli "Fish" i "Fish" są tymi samymi znacznikami, prawdopodobnie powinieneś mieć je tylko raz w swojej tabeli Tag.

Tak, chciałbym pójść z twoim pierwszym rozwiązaniem - które, faktycznie, implikuje robienie select przed twoim insert, by określić czy tag już istnieje, czy nie; oraz, jeśli istnieje, przy użyciu istniejącego już TagID dla łącza między przedmiotem a tagiem, w tabeli ItemTag.

W rzeczywistości jest to powód, dla którego istnieje ItemTag: jest to tablica asocjacyjna, która przechowuje relacje między przedmiotami i tagiem: dla każdej pozycji możesz mieć kilka tagów, a dla każdego tagu możesz mieć kilka przedmiotów.

Dzięki temu łatwiej będzie uzyskać listę elementów dołączonych do określonego znacznika.

1

Powinieneś mieć znaczniki tylko jeden raz w tabeli znaczników; cały punkt tabeli ItemTag ma zapewnić powiązanie n: m (każdy element ma wiele znaczników, a każdy znacznik należy do wielu elementów).

Jeśli chciałbyś powtórzyć tytuły tagów, możesz uprościć strukturę, od razu używając Tabeli znaczników, a nie identyfikatorów znaczników.

+0

-1: Powtarzanie tagów i posiadanie tabeli znaczników use item_ids sprawiłoby, że wyszukiwanie naprawdę kosztowałoby drogo, ponieważ wyszukiwanie odbywało się przez porównywanie łańcuchów zamiast liczb całkowitych, które są znacznie wolniejsze. – Eimantas

+0

@Eimantas: Nie polecałem powtarzania tagów. Ja tylko, że te * jeśli * tagi mają się powtarzać, możesz upuścić jeden stół. –

Powiązane problemy