stelar7 Skrevet 26. april 2013 Del Skrevet 26. april 2013 (endret) Prøver å lagre når en gruppe personer reiser til en plass. Har planer om å ha 2 tables: personer: id int, navn text/varchar? (anta ca. 1000 personer) reiser: id int, plass text/varchar?, personer ? 1. Er ikke sikker på hvilken datatype som skal brukes i personer, er det mulig å lagre en liste med tall(personer.id)? er det evnt. en bedre måte å gjøre dette på? 2. Er det en query som kan ta tallene i personer, gjøre de om til navn, så returnere de? SELET navn FROM database.personer WHERE database.reiser.personer inneholder database.personer.id? Har ikke så mye peiling på dette, untatt helt basic SELECT, CREATE, INSERT, UPDATE og DROP Endret 26. april 2013 av stelar7 Lenke til kommentar
oldis Skrevet 26. april 2013 Del Skrevet 26. april 2013 Viser et tilsvarende eksempel fra Oracles demo-schema SCOTT: CREATE TABLE DEPT (DEPTNO NUMBER(2), DNAME VARCHAR2(14), LOC VARCHAR2(13) ); CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7, 2), COMM NUMBER(7, 2), DEPTNO NUMBER(2)); For å hente personer fra ansatt-tabellen EMP som hører til i en bestemt avdeling (40) i DEPT: Select emp.ename Person, dept.dname Avdeling from emp, dept where emp.dno=dept.dno and dept.dno=40; Dette er den gamle måten å gjøre det på, finnes en mer moderne syntaks som kanskje er mer meningsfull for deg. Det kan du lese mer om her: http://en.wikipedia.org/wiki/Join_(SQL) Håper dette er litt til hjelp... Lenke til kommentar
oldis Skrevet 26. april 2013 Del Skrevet 26. april 2013 (endret) Mer spesifikt til ditt eksempel: CREATE TABLE sted (stedID NUMBER(2), stedsNavn VARCHAR(40), kapasitet NUMBER(4) ); INSERT INTO sted VALUES (10, 'Oslo', 300); INSERT INTO sted VALUES (20, 'Bergen', 250); INSERT INTO sted VALUES (30, 'Kristiansand', 100); CREATE TABLE person (personID NUMBER(5) NOT NULL, -- dette er primary key kolonne personNavn VARCHAR2(50), stedID NUMBER(2)); INSERT INTO person VALUES (1000, 'Per', 10); INSERT INTO person VALUES (1001, 'Ola', 10); INSERT INTO person VALUES (1002, 'Lars', 20); Spørring: Select person.personNavn , sted.stedsNavn from person, sted where sted.stedID=person.stedID and sted.stedID=10; Denne gir deg alle som hører til oslo. Dil du ha alle tar vekk and og det som kommer etterpå. Dette blir veldig generelt, siden du ikke sier noe om hvilken database-plattform du er på. Det bør jo også legges på Primærnøkkel på begge tabellene, samt Fremmednøkkel på stedID i persontabellen. Håper jeg ikke har gjort for mye feil, begynner å bli en stund siden sist... Endret 26. april 2013 av oldis Lenke til kommentar
oldis Skrevet 26. april 2013 Del Skrevet 26. april 2013 (endret) SQL> Select person.personNavn , sted.stedsNavn from person, sted where sted.stedID=person.stedID and sted.stedID=10; PERSONNAVN STEDSNAVN ------------- ------------------------ Per Oslo Ola Oslo Endret 26. april 2013 av oldis Lenke til kommentar
oldis Skrevet 26. april 2013 Del Skrevet 26. april 2013 Select person.personNavn , sted.stedsNavn from person, sted where sted.stedID=person.stedID; PERSONNAVN STEDSNAVN ------------- ------------------------ Per Oslo Ola Oslo Lars Bergen Lenke til kommentar
stelar7 Skrevet 26. april 2013 Forfatter Del Skrevet 26. april 2013 (endret) Det er en MySQL database Problemet med å gi personer en stedID er at de ikke har en plass fra før, de er bare en slags enum Personer peker da til ID i person tabellen! Endret 26. april 2013 av stelar7 Lenke til kommentar
oldis Skrevet 26. april 2013 Del Skrevet 26. april 2013 (endret) Det er en MySQL database Problemet med å gi personer en stedID er at de ikke har en plass fra før, de er bare en slags enum Da må du ha 3 tabeller: Person Reiser Reisebestilling (e.l) Du vil jo gjerne at en person kan ha mange reiser, og du vil at en reise kan ha mange personer. Endret 26. april 2013 av oldis Lenke til kommentar
stelar7 Skrevet 26. april 2013 Forfatter Del Skrevet 26. april 2013 (endret) Det er aldri mer en 60stk. på en reise. Personer i Reiser tabellen peker til ID i Personer tabellen, ikke til anntall personer. Ser ikke hvordan det oppsettet jeg har setter en stopper for flere reiser per pers? (legge inn en ny rad med en annen reise(ID=2, REISEMÅL=Bergen, PERSONER=1 (Per))) Hvorfor trenger jeg den tredje tabellen? Er ingen måte å hente ut navnene med bare de to tabellene? Endret 28. april 2013 av stelar7 Lenke til kommentar
TheUnnamedDude Skrevet 26. april 2013 Del Skrevet 26. april 2013 Hvis en person bare kan reise til ett sted kan stedet bli lagret i person tabellen og de som er med på reisen kan bli lagret i en annen tabell med hovedpersonen's ID og medresiende's ID. Hvis folk skal kunne være på flere reiser tror jeg det letteste er å bruke 3 tabeller. Lenke til kommentar
stelar7 Skrevet 26. april 2013 Forfatter Del Skrevet 26. april 2013 (endret) En person kan reise til så mange steder de vill EDIT: select personer.id, personer.name from personer, reiser where FIND_IN_SET(personer.id, reiser.personer); Det ser ut til å gi med ca. det jeg vil ha. Er det mulig å telle i et set? noe ala. find_in_set men med count? EDIT2: ser ut til å funke med cast((select length(set) - length(replace(set, countme, ''))) / length(countme) as decimal(65, 0)) as amount Endret 26. april 2013 av stelar7 Lenke til kommentar
quantum Skrevet 27. april 2013 Del Skrevet 27. april 2013 Hvorfor trenger jeg den tredje tabellen? Selv om tråden er løst så; du trenger den for å få et normalisert databaseskjema, noe man definitivt ønsker seg. Står mer her, lurt å ta med seg: http://en.wikipedia.org/wiki/Database_normalization Lenke til kommentar
stelar7 Skrevet 27. april 2013 Forfatter Del Skrevet 27. april 2013 (endret) Normalisering (av databaser) er en teknikk for å designe tabeller i relasjonsdatabaser slik at man minimerer duplisering av informasjon. Hvordan hindrer en rekke med duplikat info det at mer duplikat info blir skapt? Endret 27. april 2013 av stelar7 Lenke til kommentar
quantum Skrevet 28. april 2013 Del Skrevet 28. april 2013 (endret) Hvordan hindrer en rekke med duplikat info det at mer duplikat info blir skapt? Øhh, nei, si dét ... kanskje du kan reformulere det der litt? Endret 28. april 2013 av quantum Lenke til kommentar
stelar7 Skrevet 28. april 2013 Forfatter Del Skrevet 28. april 2013 http://no.wikipedia.org/wiki/Normalisering#F.C3.B8rste_normalform Der er det jo en rekke med duplikat info, bare at tlf.nr. er endret. Hvorfor er det god praksis? Lenke til kommentar
etse Skrevet 28. april 2013 Del Skrevet 28. april 2013 http://no.wikipedia....rste_normalform Der er det jo en rekke med duplikat info, bare at tlf.nr. er endret. Hvorfor er det god praksis? Normalisering handler om å øke hvilken "form" du er på. Første normalform har masse duplikater, men ved å legge på mer restriksjoner i oppbygningen av databasen kan du ganske enkelt oppnå "tredje normalform" som er den man anbefaler folk å bruke i de fleste tilfeller. Lenke til kommentar
quantum Skrevet 28. april 2013 Del Skrevet 28. april 2013 http://no.wikipedia....rste_normalform Der er det jo en rekke med duplikat info, bare at tlf.nr. er endret. Hvorfor er det god praksis? Ja, det er med andre ord et skjema med lav normaliseringsgrad. 1. normalform er den laveste normaliseringsgraden, og altså det du skulle prøve å styre unna, ikke tilstrebe. Lenke til kommentar
stelar7 Skrevet 28. april 2013 Forfatter Del Skrevet 28. april 2013 (endret) Siden informasjonen i tabell 2 bare er en peker til tabel 1, så vil det jo være null duplisering? Bør en ikke lagre arrays i databaser? Er godt mulig jeg er helt på villspor... Endret 28. april 2013 av stelar7 Lenke til kommentar
quantum Skrevet 28. april 2013 Del Skrevet 28. april 2013 Siden informasjonen i tabell 2 bare er en peker til tabel 1, så vil det jo være null duplisering? Bør en ikke lagre arrays i databaser? Usikker på hvilke tabeller du sikter til. Generelt lagrer du ikke arrays eller lister i en database, eksempelvis å lagre en liste av tall i et databasefelt er som regel noe man ønsker å unngå. Lenke til kommentar
MMDE Skrevet 28. april 2013 Del Skrevet 28. april 2013 (endret) Jeg kommer til å skrive int hver gang det er snakk om numre, men du vet ca hvor stort hver nummer trenger å være. Du kan sjekke hva slags type du trenger her: http://dev.mysql.com...eger-types.html Anbefaler å bruke unsigned med mindre du trenger negative tall. varchar, du må bestemme hvor mange bokstaver som er nødvendig som maks. Personer: personid (int), fornavn (varchar), etternavn (varchar) Du bør ha personid som primary key og auto increment. Steder: stedsid (int), stedsnavn (int), (lengdegrad, breddegrad etc om nødvendig) Reiser: reiseid (int), fra (int), til (int), tid (int), reisetid (int) fra og til er linket til stedsid Passasjerer: passasjerid (int), reiseid (int), personid (int) Noe sånt som det her. Du lager en tabell for så og si alt som er et substantiv, og så fyller du inn beskrivende detaljer om det. Hvis du ser noen av detaljene du bruker til å beskrive med trenger å bli beskrevet lager du en ny tabell for det. o.O Håper ikke dette virket for rotete. Ja det er 4 tabeller istedenfor 2, men det er mye lettere å jobbe med de, og du lagrer egentlig ikke mye ekstra informasjon, tvert om, dette fordi du gjenbruker informasjonen. Endret 28. april 2013 av MMDE Lenke til kommentar
stelar7 Skrevet 28. april 2013 Forfatter Del Skrevet 28. april 2013 (endret) Jeg har jo all infoen som trengs i de to tabellene? Personer har id(int) og fullt navn(varchar). Reiser har id(int), til(varchar) og reisende(varchar). Fra, når og hvor lenge er irrelevant da det kun er reisemål som skal føres inn. Endret 28. april 2013 av stelar7 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå