PDA

View Full Version : [MySql]Come strutturare un database (tags)


Mattyfog
01-06-2011, 20:12
Avrei bisogno di un vostro aiuto perchè non so bene come strutturare un database!
Io ho una tabella nella quale devo immagazzinare i dati di alcune gite che possono essere svolte in montagna. La tabella contiente i campi id, nome-gita, descrizione-gita.
A queste gite vorrei però aggiungere dei tags ossia degli attributi che possano assumere alcuni valori predefiniti. Ad esempio:
luogo della gita: mare/montagna/lago
stagione consigliata: estate/inverno/autunno/primavera
difficoltà: 1/2/3/4/5
possibilità di avere una guida: si/no
Questi tag dovrebbero però poi poter essere associati alle gite.
Io avevo pensato di creare una tabella nella quale definire i tags e un'altra in cui stabilire quali tags sono associati alle varie gite. Ma la cosa non va bene perchè già nella tabella in cui immagazzinare i tags ci sarebbero dei problemi: alcuni tags potrebbero avere 5 valori, altri sono 2, ecc. Inoltre ad ogni gita potrebbero essere associati un numero illimitato di tags.
Consigli?

krivo
02-06-2011, 11:59
provo a dirti la mia:
crei delle tabelle apposite per questi tags, ad esempio
luogo della gita: mare/montagna/lago
e poi banalmente nella tabella principale dove
inserisci le gite nell'attributo "luogo gita" crei un vincolo
di integrità referenziale alla tabella prima creata, così
facendo i valori dell'attributo dovranno essere contenuti
per forza anche nella tabella esterna per essere validi.

Inoltre per la difficoltà puoi introdurre un vincolo di controllo
che controlli che il valore sia intero e compreso tra 1 e 5 ad esempio

Mattyfog
02-06-2011, 14:02
provo a dirti la mia:
crei delle tabelle apposite per questi tags, ad esempio
luogo della gita: mare/montagna/lago
e poi banalmente nella tabella principale dove
inserisci le gite nell'attributo "luogo gita" crei un vincolo
di integrità referenziale alla tabella prima creata, così
facendo i valori dell'attributo dovranno essere contenuti
per forza anche nella tabella esterna per essere validi.

Inoltre per la difficoltà puoi introdurre un vincolo di controllo
che controlli che il valore sia intero e compreso tra 1 e 5 ad esempio
Così però la tabella principale dovrebbe già avere un attributo per ogni tags e quindi non si potrebbero aggiungere nuovi tags.
Sempre che io abbia capito ciò che mi volevi dire!

WarDuck
02-06-2011, 15:01
Alcuni database ti permettono di definire i tuoi personali tipi di dato, alcuni credo supportano direttamente gli ENUM, che è quello che ti serve nel tuo caso.

Mattyfog
02-06-2011, 15:30
Alcuni database ti permettono di definire i tuoi personali tipi di dato, alcuni credo supportano direttamente gli ENUM, che è quello che ti serve nel tuo caso.

Ma con gli Enum resta il problema che i tags dovrebbero essere definiti al momento di creazione della tabella e quindi non potrei aggiungere tags!
Non si potrebbe avere una tabella del tipo:
ID | NOME TAG | VALORI
1 | stagione | estate/inverno

Cioè non esistono dei campi che nei quali si possano inserire degli array? (nel mio esempio, il campo "VALORI")

Mattyfog
02-06-2011, 17:37
Ho letto online che utilizzando serialize() su un array si riesce ad ottenere una stringa sola che "contenga" tutto un array e viceversa riottenerla usando unserialize(). Così riescono a salvare degli array in un singolo campo.
Tuttavia così non calerebbero molto le prestazioni? In realtà il sito sarà piccolo e quindi la cosa potrebbe essere trascurabile ma vorrei più che altro capire quale sia il modo più pulito di gestire la situazione!

filosg4ng4
03-06-2011, 23:25
Ciao a tutti,

vediamo se ti piace questa soluzione:

TABELLA GITA
---------------
id: int - PK
nome: varchar(255)
descrizione: varchar(255)
difficolta: int(1)
consigliato_primavera: bool
consigliato_estate: bool
consigliato_autunno: bool
consigliato_inverno: bool
possibilita_guida: bool

TABELLA TIPO_LUOGO
----------------
id: int PK
nome: varchar(255)

TABELLA GITA_LUOGHI
----------------------
id_tipo_luogo: int
id_gita: int
Chiave sulla coppia id_tipo_luogo - id_gita


Così facendo ho "razionalizzato" le tue richieste, per poterli navigare anche con una ricerca. Ho creato la "tipo_luogo" per permettere combinazioni tipo "Laghi montani", oppure "Canneto in Palude di Lago Marittimo" :sofico:
tutti gli altri, io li ho messi come attributo alla tabella gita... discutibile, ovvio... ma io farei così.

La cosa semplice semplice ma che non mi piace sarebbe avere la tabella "TAG"...

TABELLA TAG
-------------
id: int PK
nome_tag: varchar(255)

TABELLA GITA
--------------
id: int PK
nome: varchar(255)
descrizione: varchar(255)

TABELLA TAG_GITA
-------------------
id_tag: int
id_gita: int

Così si potrebbero associare tutti i tag "censiti" nella tabella TAG... solo che a me non piace... troppo "generico" e poco "semantico" (non mi dice nulla...) :mbe:

Che ne dici ?
Ciao,
Filo

black_wizard
04-06-2011, 11:55
Ciao a tutti,
La cosa semplice semplice ma che non mi piace sarebbe avere la tabella "TAG"...

TABELLA TAG
-------------
id: int PK
nome_tag: varchar(255)

TABELLA GITA
--------------
id: int PK
nome: varchar(255)
descrizione: varchar(255)
difficolt: int
guida:bool

TABELLA TAG_GITA
-------------------
id_tag: int
id_gita: int

Così si potrebbero associare tutti i tag "censiti" nella tabella TAG... solo che a me non piace... troppo "generico" e poco "semantico" (non mi dice nulla...) :mbe:

Che ne dici ?
Ciao,
Filo

Il metodo descritto è il migliore anche se vedo che manca "difficoltà e guida" che credo che siano più delle flag che dei tag....cioè possono avere solo dei singoli valori.
Cmq basta aggiungere 2 campi nella tabella gita.
Questo metodo ti permetterà di ottimizzare al meglio le ricerche...soprattutto per le tag. Per fare un esempio questo è il metodo che usa anche wordpress per salvare le tag.
Ci sarebbero anche altri metodi ma nessun così efficace per le ricerche...

Mattyfog
04-06-2011, 12:15
La tua idea non sarebbe male ma il fatto è che i tag che vi ho proposto io erano solo degli esempi mentre io vorrei dare all'admin la più completa personalizzazione dei tags.
L'unica idea che ho avuto è la seguente. Non sarà molto pulita e neppure a me piace troppo ma permette una personalizzazione completa e su un sito piccolo non dovrebbe dare problemi di sorta.

TABELLA GITA
---------------
id: int PK
nome_gita: varchar (255)
descrizione: text

TABELLA TAGS
----------------
id: int
nome_tag: varchar (255)

TABELLA VALORI TAGS
-------------------------
tag_corrispondente: int
valore: varchar (255)

TABELLA RELAZIONI
----------------------
id_gita: int
id_valori: int

In questo modo avrei una tabella dove inserire tutti i tags. I valori di essi sarebbero inseriti in un'altra tabella e collegati ad essi tramite il campo id.
Infine alle varie gite, nella tabella relazioni, associerò tutte le gite ai vari tags.
E' la soluzione più semplice che mi sia venuta in mente per lasciare all'admin la più completa personalizzazione dei tags. In fin dei conti quando si dovrà effettuare una ricerca si agirà solamente sulla tabella relazioni mentre poi il software dovrà interrogare la tabella tags e la tabella valori tags solo per ottenere il nome del tags e il nome del valore.

Che ne pensate?

black_wizard
04-06-2011, 12:38
ah ora ho capito cosa intendi.
In pratica le tag sono raggruppate in una specie di categoria...perchè c'è la tag che sarebbe la "stagione" e la tag "luogo".
Cmq l'ultimo metodo che hai scritto va bene anche se potevi fare in modo diverso..tipo così

TABELLA GITA
---------------
id: int PK
nome_gita: varchar (255)
descrizione: text

TABELLA TAGS
----------------
id: int
nome_tag: varchar (255)
categoria_tag: int

TABELLA Categoria
-------------------------
id_categoria: int
nome_categoria: varchar (255)

TABELLA RELAZIONI
----------------------
id_gita: int
id_valori: int


in poche parole il campo tags sarebbe così

TABELLA TAGS
----------------
id Valore Categoria
1 Estate 3

TABELLA Categoria
-------------------------
id Nome
3 Stagione

Mattyfog
04-06-2011, 12:46
Si esatto mi ero dimenticato di scrivere un campo :D
Grazie mille! Allora direi che farò così! ;)