Newsgroup: it.comp.www.php
Titolo: User che veda uno o più brand

Salve,
 
da newbie vorrei un parere sulla situazione seguente:
 
User che può vedere uno o più brand ed ogni brand ha i suoi prodotti 
memorizzati in product.
 
Usando MySQL, INNODB e le FK è facile legare la tabella user alla 
tabella brand con un rapporto di 1 a 1 ma come potrei fare a legare un 
user a più brand? O meglio come potrei inserire tali informazioni in una 
tabella del db?
 
Per quanto riguarda la tabella product invece basta una sola chiave per 
legare i prodotti al brand quindi in questo caso il rapporto 1 a 1 va bene.
 
Saluti.
GabrieleMax

 legare i prodotti al brand quindi in questo caso il rapporto 1 a 1 va bene.
 
1:n, che in SQL si esprime "al contrario" (cioè sono i prodotti che
linkano al brand, e non viceversa):
 
create table product (id primary key, brand_id int references brand(id),
...)
 
(vado a memoria con la sintassi, ultimamente sto usando troppi DB
diversi... :D)
 
1:1 significa che hai un solo prodotto per brand, che non ha senso. :)
 
Il rapporto 1:1 con foreign keys si usa di solito per ottimizzare i dati
sul supporto. Per esempio mettendo in una partizione diversa o su un
engine diverso dati che vengono acceduti meno spesso anche se in realtà
potrebbero stare nella stessa tabella.
 
Nel caso del brand, per esempio, potresti mettere l'indirizzo o i
contatti in una tabella separata, perché ti servono solo quando
l'amministrazione deve fatturare, e tenere solo nome, id e logo in una
tabella può portare ad avere effettivamente tutta la tabella dei brand
in cache in RAM per il 99.9% del tempo.
 
Bye.

 Bye.
 
Saluti e grazie ancora per tutte le precisazioni/risposte!
GabrieleMax

 vedere non solo "A" ma anche "B", "C", etc.
 
No. Nella tabella user metti tutti i dati degli utenti. Nella tabella
brand metti tutti quelli dei brand.
 
Nella tabella user_brand metti sono l'id dell'utente e quello del brand
a cui vuoi associarlo.
 
Vuoi tutti i brand di un utente (dato un $userId)?
 
select b.* from user_brand ub join brand b on ub.brand_id=
b.id
 where
ub.user_id=$userId
 
Vuoi tutti gli utenti associati a un brand (dato un $brandID)?
 
select u.* from user_brand ub join user u on ub.user_id=
u.id
 where
ub.brand_id=$brandId
 
Bye.

 
 
Probabile, ma qui c'è un altra cosa da dire. Prevedere il caching di un
DBMS è una delle cose più complicate che esistano, perché a quel livello
di astrazione ci sono almeno quattro/cinque livelli di cache. Anche qui,
prima di cercare di capire di cosa ha effettivamente bisogno di stare in
cache, e soprattutto non fidarsi degli algoritmi di default, bisogna essere
in una situazione non comune.
 
Ciao!

 a cui vuoi associarlo.
 
Ti ringrazio per l'ulteriore risposta! Ti chiedo un parere, se avessi 
una tabella chiamata user con tutti gli utenti e le loro descrizioni e 
la tabella brand con tutti i marchi e la loro descrizione potrei 
"linkare" con una FK uno o più marchi allo stesso utente usando quindi 
solo due tabelle!
 
Saluti.
GabrieleMax

 solo due tabelle!
 
Se un marchio può essere associato a un solo utente (1:n), allora sì, 
col sistema che ho spiegato per collegare i prodotti ai brand.
 
Se un brand può essere associato a più utenti e un utente a più brand 
(n:n) l'unico modo è quello con la tabella di collegamento.
 
Bye.
 

 Bye.
 
Saluti!
GabrieleMax