Avatar billede htx98i17 Professor
26. december 2008 - 20:28 Der er 17 kommentarer og
1 løsning

vurdering af struktur

1. Vil nogen kigge på følgende struktur, inden jeg går videre. Specielt column types. Også INDEX, men det kan måske være lidt sværere at vurdere...

2. Derudover måske en forklaring på hvorfor NULL og hvorfor ikke NOT NULL ? (manualen anbefaler NOT NULL hvis NULL ikke er nødvendig)

CREATE TABLE `tblbrugerinformation` (
  `id` int(11) NOT NULL auto_increment,
  `brugerid` int(11) NOT NULL default '0',
  `navn` varchar(100) NOT NULL default '',
  `foedselsdato` date NOT NULL default '0000-00-00',
  `fritord` tinytext NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `loginid` (`brugerid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen `tblbrugerlogin`
--

CREATE TABLE `tblbrugerlogin` (
  `id` int(11) NOT NULL auto_increment,
  `emailadresse` varchar(100) NOT NULL default '',
  `adgangskode` varchar(10) NOT NULL default '',
  `level` char(1) NOT NULL default '1',
  `oprettet` timestamp NOT NULL default CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  KEY `emailadresse` (`emailadresse`),
  KEY `adgangskode` (`adgangskode`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen `tblforumkategorier`
--

CREATE TABLE `tblforumkategorier` (
  `id` int(11) NOT NULL auto_increment,
  `label` varchar(30) NOT NULL default '',
  `beskrivelse` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen `tblforumposter`
--

CREATE TABLE `tblforumposter` (
  `id` int(11) NOT NULL auto_increment,
  `toppostid` int(11) NOT NULL default '0',
  `brugerid` int(11) NOT NULL default '0',
  `oprettet` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `indhold` text NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `brugerid` (`brugerid`),
  KEY `oprettet` (`oprettet`),
  KEY `toppostid` (`toppostid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen `tblforumtopposter`
--

CREATE TABLE `tblforumtopposter` (
  `id` int(11) NOT NULL auto_increment,
  `kategoriid` int(11) NOT NULL default '0',
  `brugerid` int(11) NOT NULL default '0',
  `oprettet` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `emne` varchar(100) NOT NULL default '',
  `indhold` text NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `kategoriid` (`kategoriid`),
  KEY `oprettet` (`oprettet`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Avatar billede arne_v Ekspert
26. december 2008 - 20:39 #1
re 2)

NULL tillader at et felt er ikke udfyldt (NULL er forskellig fra numerisk 0 og streng "")

NOT NULL kræver at feltet har en værdi evt. 0 eller ""

et PRIMARY KEY felt kan ikke være NULL

NOT NULL hjælper til at enforce lidt data disciplin
Avatar billede arne_v Ekspert
26. december 2008 - 20:44 #2
re 1)

`oprettet` timestamp er vist ikke så godt - et TIMESTAMP felt vil default blive sat til
NOW hver gang rækken ændres

er `brugerid` int(11) nødvendigt når du har et id ?

hvorfor er `tblbrugerinformation` og `tblbrugerlogin` i 2 tabeller ?

hvorfor `fritord` tinytext og ikke VARCHAR(255) ?

muligvis index på `tblbrugerinformation`.`navn`

hvad er topposter ??
Avatar billede htx98i17 Professor
26. december 2008 - 20:56 #3
- `oprettet` ok, den skal ikke automatisk opdatere når rækken bliver ændret. Skal jeg så vælge `datetime` i stedet for?

- tblbrugerinformation.brugerid er fremmednøgle til tblbrugerlogin.id

- `tblbrugerinformation` og `tblbrugerlogin` er i to tabeller for at holde tingene adskilt. Nok mest for mit eget overbliks skyld. Men derudover er dataene i tblbrugerinformation ikke krævet af brugeren. (tja bortset fra tblbrugerinformation.navn som jo så faktisk skal rykkes over i tblbrugerlogin.)

- `fritord`: varchar(255) betyder det ikke et max antal tegn på 255 stk. ? måske har brugeren brug for flere end 255? eller er det usandsynligt.

- topposter er "hovedspørgsmålet" om man kan kalde det det. Under hovedspørgsmålet kommer svarene som så ligger i tblforumposter. I tbltopposter er to ekstra felter (kategori_id og emne).

Kom endelig med mere :)
Avatar billede arne_v Ekspert
26. december 2008 - 21:18 #4
Ja.

Jeg er skeptisk overfor ideen med de 2 tabeller med 1:1 relation - jeg tror at en enkelt tabel
med felter som tillader NULL er bedre.

VARCHAR(255) er max. 255 tegn, men det er TINYTEXT også !!
Avatar billede htx98i17 Professor
26. december 2008 - 21:21 #5
10-4 jeg forstår.

hvad med tblbrugerlogin.level CHAR(1) er den OK ?
Avatar billede htx98i17 Professor
26. december 2008 - 21:27 #6
værdien kan være fra 0-3
Avatar billede htx98i17 Professor
26. december 2008 - 21:34 #7
Hvis jeg i en tabel har 2 felter, begge NOT NULL.
og jeg i  min sql undlader det ene felt. Er det så korrekt at posten ikke vil blive behandlet?
Avatar billede arne_v Ekspert
26. december 2008 - 21:38 #8
Hvis den er numerisk i natur ville jeg bruge TINYINT.
Avatar billede arne_v Ekspert
26. december 2008 - 21:38 #9
En INSERT vil fejle ja.
Avatar billede htx98i17 Professor
26. december 2008 - 21:40 #10
21:38:20 -> hvad mener du med i natur?
21:38:45 -> ikke en update?
Avatar billede arne_v Ekspert
26. december 2008 - 21:44 #11
at det er et tal og ikke en tekst - den hurtige test er at tallet 2 er mindre end tallet
11 mens strengen "2" er større end strengen "11"
Avatar billede arne_v Ekspert
26. december 2008 - 21:45 #12
En UPDATE der forsøger at sætte feltet til NULL vil fejle, men en UPDATE som retter andre felter
kan fint virke.
Avatar billede arne_v Ekspert
26. december 2008 - 21:45 #13
Det er kun operationer som vil forsøge at puttet NULL i et NOT NULL felt der vil fejle.
Avatar billede htx98i17 Professor
26. december 2008 - 21:56 #14
ach so! super.

Jeg har brugt VARCHAR() fordi det er hvad så mange andre bruger :)

Men hvad bruges CHAR() så til? det er noget med at der fyldes op fra højre med spaces. og så kan værdien være max 255 tegn.

Og VARCHAR fyldes ikke om fra højre, og kan have helt op til 65,535 tegn, eller bytes?
Avatar billede arne_v Ekspert
26. december 2008 - 22:28 #15
VARCHAR er til tekst i variabel længde - CHAR er til tekst i fast længde - det er
sjældent at man bruger CHAR idag
Avatar billede arne_v Ekspert
26. december 2008 - 22:29 #16
VARCHAR er i ældre MySQL versioner max. 255 men i nyere versioner op til 65535.
Avatar billede htx98i17 Professor
27. december 2008 - 08:08 #17
tak for hjælpen :)
du skal have nogle point så lig et svar
Avatar billede arne_v Ekspert
27. december 2008 - 15:12 #18
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester