Vinnaren i pepparkakshustävlingen!
2012-12-29, 02:08
  #1
Medlem
Zhirgoyts avatar
Jag håller på med ett projekt där jag behöver koppla ihop användare med en godtycklig mängd attribut. Dessa har i sin tur också attribut. Mängden användare skall också vara godtycklig och jag kan inte för mitt liv förstå hur jag skall göra det på ett bra sätt med en mySQL-databas.

De olika alternativen, som jag tänker mig:

Alt 1:
Sätta upp en tabell för varje ny användare och sedan lägga till rader för varje nytt attribut.

Alt 2:
Sätta upp en tabell där man lägger in varje användare, med attributen som en sammanbunden textsträng.

Alt 3:
Sätta upp en tabell där man lägger in varje användare och för varje nytt attribut lägger man på en kolumn med under-attributen som en sammanbunden textsträng.

Finns det fler bättre alternativ? För dessa suger.
Citera
2012-12-29, 02:16
  #2
Medlem
OldMKenseys avatar
En tabell för användare, en tabell för attribut - och sedan två mappningstabeller för info om vilka anv som har vilka attribut, samt vilka attribut som i sin tur har egna attribut. 4 tabeller. Svårt?
Citera
2012-12-29, 02:35
  #3
Medlem
Beror lite på vad exakt du menar.

Säg att du har en användare "Sara" med attributet "hår" som i sin tur har attributet "längd". Är det då ok att lägga till en användare "Hans" med attributet "hår", men här enbart har attributet "färg" och inte längd, samtidigt som attributet "hår" hos "Sara" enbart har attributet längd?
Citera
2012-12-29, 11:31
  #4
Medlem
Zhirgoyts avatar
Citat:
Ursprungligen postat av OldMKensey
En tabell för användare, en tabell för attribut - och sedan två mappningstabeller för info om vilka anv som har vilka attribut, samt vilka attribut som i sin tur har egna attribut. 4 tabeller. Svårt?
Mappningstabell vet jag inte vad det är. Tar en titt på det, tack!

Citat:
Ursprungligen postat av patwotrik
Beror lite på vad exakt du menar.

Säg att du har en användare "Sara" med attributet "hår" som i sin tur har attributet "längd". Är det då ok att lägga till en användare "Hans" med attributet "hår", men här enbart har attributet "färg" och inte längd, samtidigt som attributet "hår" hos "Sara" enbart har attributet längd?

Nej, alltså samma attribut kommer att ha lika många "subattribut". Om Sara och Hand har attribut hår så kommer båda ha subattribut längd och färg (tex).
Citera
2012-12-29, 12:14
  #5
Medlem
Zhirgoyts avatar
Lite mer info:
Det kommer finnas färre attribut än användare då många kommer ha samma, däremot kommer subattributen till dessa "alltid" vara olika för olika användare.

Tänk att vi pratar om... Sporter och artistnamn/skostorlek. Flera användare kommer ha fotboll, men inte många kommer ha samma artistnamn/storlek. Dåligt exempel, jag vet.
__________________
Senast redigerad av Zhirgoyt 2012-12-29 kl. 12:16.
Citera
2012-12-29, 12:15
  #6
Medlem
Tog bort ej fullständig post
__________________
Senast redigerad av sagonar 2012-12-29 kl. 12:34. Anledning: kom åt post knappen av misstag avslutade inte posten (Ej fullständig sql)
Citera
2012-12-29, 12:33
  #7
Medlem
Citat:
Ursprungligen postat av Zhirgoyt
Nej, alltså samma attribut kommer att ha lika många "subattribut". Om Sara och Hand har attribut hår så kommer båda ha subattribut längd och färg (tex).
Tror att du missade lite vad han frågade..

1 Program ändras, vad som "stämmer" nu är inte altid samma som imorgon, Nya krav et.c. kommer in.

Så för att försöka förtydliga lite nu (Vi prata om databaser här inte program direkt..)
Vad skall hända om programmet försöker lägga till en användare Hans med attributet "färg " på sitt hår ?
Om du svara "kommer inte att hända" se punkt 1
Så du har 2 alternativ.
Antingen så blockeras denna addering av databasen. (Constraints i databasen )
Eller så godkänns det att lägga till användaren Hans.

Enklast att godkänna den tycker jag.

Kod:
CREATE TABLE users (
         id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
         name VARCHAR(100)
);
CREATE TABLE attributes (
         id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
         name VARCHAR(100)
);
create table userattributes (
 userid int not null,
 attributeid int not null,
 FOREIGN KEY (userid) References users(id),
 FOREIGN KEY (attributeid) References attributes(id)
);

insert into users (name) values("hans");
insert into attributes (name) values("hair");

insert into userattributes(userid, attributeid) values ( (select id from users where name='hans'), (select id from attributes where name='hair'));

- Vilka users har "hair" attributet ?
select userid from userattributes where attributeid=(select id form attributes where name='hair');

-- Vilka username gav frågan ovan..(OBS user.name är INTE IDENTITETEN, det är userid)
select users.name from userattributes join users on users.id=userattributes.userid where attributeid=(select id from attributes where name='hair');
Rekommendera googla lite på sql JOIN och experimentera lite med detta.
Tror att en mappnings tabell här som jag använde: userattributes kan nog behöva ha index.
Citera
2013-01-02, 16:18
  #8
Medlem
Zhirgoyts avatar
Citat:
Ursprungligen postat av sagonar
Wall

Tack så mycket för hjälpen! Gjorde inte precis som du skrev, men det var verkligen en hjälp på vägen.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback