webForumDet fria alternativet

Flera tabeller - rörigt!

Databaser & SQL

12 svar · 188 visningar · startad av maland

Medlem sedan nov. 200156 inlägg
Frågan#1

Tyckte att jag var jättesmart - tydligen inte....
Jag har sju tabeller som ska länkas samman på nåt bra vis...
En tabell med info om anställda, en med info om projekt, en med info om företag, en med info om projektledare, en med info om utvecklare, en med info om säljare samt en med info om kontaktperson...
Frågan är bara hur gör jag??
Varje företag kan ha flera kontaktpersoner. Varje företag kan ha flera projekt. Varje projekt kan ha flera utvecklare, projektledare samt säljare. Rörigt eller hur?? Är det någon som har gjort nåt liknande som kan komma med förslag?

------------------
.: Malin :.

Medlem sedan dec. 200012 464 inlägg
#2

Om du vill joina flera tabeller så är
det enklast att skriva join-villkoret i where

select *
  from t1,t2,t3,t4,t5,t6,t7
 where t1.id = t2.id
   and t2.id = t3.id
   and t3.id = t4.id
   and t4.id = t5.id
   and t5.id = t6.id
   and t6.id = t7.id

------------------
essentitia preter non sans multiplicandum

Medlem sedan dec. 200012 464 inlägg
#3

Eller så kan du skapa join-vyer och använda dom istället, så förenklar du det hela.

------------------
essentitia preter non sans multiplicandum

Medlem sedan nov. 200156 inlägg
#4

Men jag har problem när jag ska länka samman dem i diagrammet....I den ena tabellen har jag fyra nycklar och sedan har jag tre tabeller med två nycklar i varje. Från tabellen med två nycklar vill jag ju koppla ihop en nyckel med en nyckel i tabellen med fyra nycklar o.s.v men då får jag meddelande: The columns i table 'anteckningar' do not match an existing primary key or unique constraint

------------------
.: Malin :.

Medlem sedan dec. 200012 464 inlägg
#5

Oki, jag trodde något annat, uppenbarligen.

Om du vill ha en relation mellan två tabeller så måste kolumnerna i nycklarna i de båda tabellerna stämma överens till både antal och typ.

Du kan inte skapa en främmande nyckel till en del av en primärnyckel/unique

------------------
essentitia preter non sans multiplicandum

Medlem sedan nov. 200156 inlägg
#6

Så m jag har tabellen Anteckningar med fälten:
Ant_id (PK)
foretag
utv_id (1)
proj_led_id (2)
salj_id (3)
projektnamn
rubrik
status

Sedan har jag en tabell Utvecklare:
utv_id (1)
pers_id (*)

En tabell saljare:
salj_id (3)
pers_id (*)

En tabell Person
id (PK)(*)
namn
osv

Du ser vilka som ska höra ihop va? :-)
1:an med 1:an * med * osv
Förstår du? Eller svammlar jag?

------------------
.: Malin :.

Medlem sedan dec. 200012 464 inlägg
#7

Jag kan titta på det senare idag så jag återkommer. Måste jobba nu ;)

------------------
essentitia preter non sans multiplicandum

Medlem sedan dec. 200012 464 inlägg
#8

Det som jag tycker är konstigt med din modell är tabellen anteckningar som jag inte förstår vad du skall ha till.

Med den information som du har givit så skulle jag lägga upp det så här

Tre bastabeller

project,person, company

Fyra kopplingstabeller

projectmember -- vilka deltar i projekt innehåller även vilken uppgift (säljare, utvecklare etc)
-- samma person kan förekomma flera gånger med olika uppgifter

employee -- anställda

contact -- kontaktpersoner

participant -- företag som deltar i ett projekt

create table project(id int identity, name varchar(30), budget integer,notes varchar(300),startDate date,endDate date,primary key(id),unique(name))

create table person(id int,firstName varchar(30), lastName varchar(30), phoneNumber char(10),primary key(id))

create table company(id int,name varchar(30),adress varchar(50),primary key(id),unique (name))

create table projectMember (projectId int,personId int, task varchar(20), primary key(projectid,personid,position), foreign key(projectid) references project(id), foreign key(personId) references person(id),check(task in ('Developer', Salesperson',ProjectLeader')))

create table employee(companyid int, personid int, hireDate date,primary key(companyid,personid),
foreign key(companyid) references company(id),foreign key(personId) references person(id))

create table contact(companyid int, personid int, primary key(companyid,personid),
foreign key(companyid) references company(id),foreign key(personId) references person(id))

create table participant(companyid int, projectid int, primary key(companyid,project),
foreign key(companyid) references company(id),foreign key(personId) references person(id))

------------------
essentitia preter non sans multiplicandum

Medlem sedan nov. 200156 inlägg
#9

Tabellen anteckningar är väl egentligen till för att kunna lägga till info om projektet, ex vis anteckningar, rubrik på anteckningar, status på projekt osv. Då tyckte jag att det även passade att slänga in id på de personer(utvecklare osv) som var knutna till projektet. Sedan har jag ju en egen tabell för det eftersom varje projekt kan ha flera utvecklare och varje utvecklare kan ha flera projekt osv...ska kolla på din modell som säkerligen är bättre! :-)

------------------
.: Malin :.

Medlem sedan nov. 200156 inlägg
#10

Nu har jag testat din modell som verkar KANON...tusen miljarder tack.

------------------
.: Malin :.

Medlem sedan nov. 200156 inlägg
#11

Funderar .....kan man inte slå ihop tabellerna person och employee?

------------------
.: Malin :.

Medlem sedan dec. 200012 464 inlägg
#12

Jo, under förutsättning att samma person inte kan ha flera anställningar. Det blir ju så att om man gör någon optimering så förlorar man i flexibilitet.

------------------
essentitia preter non sans multiplicandum

Medlem sedan nov. 200156 inlägg
#13

OK, tack så mycket för att du har tagit dig tid...Ska försöka klara mig på egen hand nu ;-)

------------------
.: Malin :.

264 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
117 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)