Kom ihåg mig?
Home Menu

Menu


Banal (?) databasfråga

 
Ämnesverktyg Visningsalternativ
Oläst 2010-11-03, 22:07 #1
clirres avatar
clirre clirre är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Nov 2005
Inlägg: 1 035
clirre clirre är inte uppkopplad
Har WN som tidsfördriv
clirres avatar
 
Reg.datum: Nov 2005
Inlägg: 1 035
Standard Banal (?) databasfråga

Hej,

Ett problem som jag löst på olika icke-eleganta sätt är detta, och något som jag gissar finns en betydligt smartare lösning på:

Jag har två tabeller - Företag och Företagstyp

Företag
FöretagsID
FöretagsNamn
FöretagsTyp

FöretagsTyp
FöretagsTypID
FöretagsTypNamn

Här vill jag koppla företagstypen hos tabellen Företag med en - eller flera! - företagstyper.

Säg att företagstyper är Gruvbolag, Skogsbolag, Stenbolag och AB Alltmöjligt är både ett Gruvbolag och Skogsbolag.

Vad är då den mest eleganta lösningen för att koppla dessa med hjälp av php och mysql?

Jag är även tacksam för sökord jag ska titta på, länkar till tutorials. Har hållt på mycket med php och mysql, men gör alltid på samma (dåliga) sätt och det är dags att uppgradera kunskaperna lite.
clirre är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-11-03, 22:34 #2
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Skapa en tredje tabell, och lägg in alla relationer i den. En kolumn för FöretagsID, och en kolumn för FöretagsTypID. Ett företag med två typer får då två rader i relationstabellen.

Om du vill ha söktips, googla på "Many-to-Many Relationship"

Senast redigerad av Lindahl den 2010-11-03 klockan 22:37
Lindahl är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-11-03, 22:40 #3
uffe_nordholm uffe_nordholm är inte uppkopplad
Medlem
 
Reg.datum: Dec 2006
Inlägg: 96
uffe_nordholm uffe_nordholm är inte uppkopplad
Medlem
 
Reg.datum: Dec 2006
Inlägg: 96
Som jag ser det finns det två alternativ.

Det första alternativet är att lägga till en INT-kolumn till tabellen som innehåller alla företag. Denna INT använder du som en binär flagga: bestäm dig för vilken bit som betyder vad och sedan använder du bitoperationer för att sätta/nollställa bitarna. Det är någorlunda enkelt att hantera, men kräver en del kunskap för att få till (tex Booles algebra och liknande). En stor nackdel är att om du börjar med en väldigt lång lista med företag kommer kanske antalet bitar (och därmed antalet företagstyper) inte att räcka till.

Det andra alternativet tycker jag är snyggare, men det belastar databasen lite mer: skapa en tabell för företagen, men den skall bara innehålla typ företagets namn, adress, kontaktuppgifter och ett unikt ID-nummer.
Detta ID-nummer använder du för att komma åt företagstypen i en andra tabell, där varje enskilt företag kan ha hur många poster som helst (en post för varje typ de skall ha). Fördelarna är att du kan ha hur många typer som helst och varje enskilt företag kan ha hur många typer som helst. Nackdelen är dock att det kräver lite mer jonglerande med tabellerna i databasen och deras innehåll.
uffe_nordholm är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-11-03, 22:41 #4
William William är inte uppkopplad
Medlem
 
Reg.datum: Oct 2010
Inlägg: 102
William William är inte uppkopplad
Medlem
 
Reg.datum: Oct 2010
Inlägg: 102
Om jag vore du, så skulle jag köra på detta.

Citat:
"skapa en tabell för företagen, men den skall bara innehålla typ företagets namn, adress, kontaktuppgifter och ett unikt ID-nummer.
Detta ID-nummer använder du för att komma åt företagstypen i en andra tabell, där varje enskilt företag kan ha hur många poster som helst (en post för varje typ de skall ha). Fördelarna är att du kan ha hur många typer som helst och varje enskilt företag kan ha hur många typer som helst. Nackdelen är dock att det kräver lite mer jonglerande med tabellerna i databasen och deras innehåll."

Senast redigerad av William den 2010-11-03 klockan 22:44
William är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-11-03, 22:48 #5
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Citat:
Ursprungligen postat av uffe_nordholm Visa inlägg
Det första alternativet är att lägga till en INT-kolumn till tabellen som innehåller alla företag /.../
Kan vara en intressant lösning om man har ett bestämt antal egenskaper som aldrig kommer kunna bli fler eller färre. Möjliggör mycket snabb sökning på exempelvis "andra företag som har exakt samma kategorisering", dock värdelöst om du vill lägga till nya kategorier.

Vilken algoritm och databasstruktur du ska använda hänger mycket på hur du vill kunna behandla och söka i datan.
Lindahl är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-11-03, 22:53 #6
William William är inte uppkopplad
Medlem
 
Reg.datum: Oct 2010
Inlägg: 102
William William är inte uppkopplad
Medlem
 
Reg.datum: Oct 2010
Inlägg: 102
Citat:
Ursprungligen postat av Lindahl Visa inlägg
Kan vara en intressant lösning om man har ett bestämt antal egenskaper som aldrig kommer kunna bli fler eller färre. Möjliggör mycket snabb sökning på exempelvis "andra företag som har exakt samma kategorisering", dock värdelöst om du vill lägga till nya kategorier.

Vilken algoritm och databasstruktur du ska använda hänger mycket på hur du vill kunna behandla och söka i datan.
Det håller jag faktiskt med dig om.
William är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-11-03, 23:04 #7
clirres avatar
clirre clirre är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Nov 2005
Inlägg: 1 035
clirre clirre är inte uppkopplad
Har WN som tidsfördriv
clirres avatar
 
Reg.datum: Nov 2005
Inlägg: 1 035
Tack för bra tips, det var faktiskt den lösningen jag tänkte köra på (separat tabell som knyter ihop de andra två tabellerna) från början. Trodde dock det fanns andra sätt som nån form av standardfunktion i Mysql eller jag vet inte.

Tack för hjälpen allesammans!
clirre är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-11-04, 20:38 #8
uffe_nordholm uffe_nordholm är inte uppkopplad
Medlem
 
Reg.datum: Dec 2006
Inlägg: 96
uffe_nordholm uffe_nordholm är inte uppkopplad
Medlem
 
Reg.datum: Dec 2006
Inlägg: 96
Ett tillägg till mitt förra inlägg: det går åt tre tabeller för den lite flexiblare lösningen (alternativ två): en tabell med info om företagen (namn, adress, telefonnummer osv), en tabell med info om företagstyperna (vad de olika typerna skall kallas: skogsbolag, stenbolag, grönsaksbolag...) och en tabell med kopplingar mellan dessa två andra tabeller.
uffe_nordholm är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-11-04, 22:27 #9
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Citat:
Ursprungligen postat av clirre Visa inlägg
Tack för bra tips, det var faktiskt den lösningen jag tänkte köra på (separat tabell som knyter ihop de andra två tabellerna) från början. Trodde dock det fanns andra sätt som nån form av standardfunktion i Mysql eller jag vet inte.

Tack för hjälpen allesammans!
Vilket var det dåliga sättet du alltid gör på då? Det här är en av de mest grundläggande strukturerna i relationsdatabaser så det kan vara värt att lägga på minnet.
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-11-04, 23:55 #10
studiox studiox är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2004
Inlägg: 1 356
studiox studiox är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2004
Inlägg: 1 356
Om du har många företag (flera hundra tusen) och många kategorier (flera tusen) och datat dynamiskt förändras (växer/minskar) kan ju NoSQL vara ett alternativ (dokumentdatabas) - relationsdatabaser är ju enbart bra på.. relationer
studiox är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 11:43.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017