Disse data er normaliseret
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data }
floor { id, building_id, data }
room {id, floor_id, data }
bed {id, room_id, data }
Denne tabel er ikke (dårlig idé)
TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data }
floor { id, building_id, data }
room {id, building_id, floor_id, data }
bed {id, building_id, floor_id, room_id, data }
- I den første (gode) tabel har du ikke unødvendige duplikerede data.
- Indsættelser i den første tabel vil være meget hurtigere.
- De første tabeller passer lettere i hukommelsen, hvilket gør dine forespørgsler hurtigere.
- InnoDB er optimeret med model A i tankerne, ikke med model B.
- Sidstnævnte (dårlige) tabel har duplikerede data, hvis der kommer ud af synkronisering, vil du have noget rod. DB A kan ikke er meget sværere at komme ud af synkronisering, fordi dataene kun er listet én gang.
- Hvis jeg vil kombinere data fra bygning, gulv, værelse og seng skal jeg kombinere alle fire borde i model A samt model B, hvordan sparer du tid her.
- InnoDB gemmer indekserede data i sin egen fil, hvis du
select
kun indekser , vil selve tabellerne aldrig blive tilgået. Så hvorfor dublerer du indekserne? MySQL behøver aldrig at læse hovedtabellen alligevel. - InnoDB gemmer PK'en i hvert sekundært indeks , med en sammensat og dermed lang PK, bremser du hvert valg, der bruger et indeks, og reducerer filstørrelsen; uden nogen som helst gevinst.
- Har du et alvorligt hastighedsproblem? Hvis ikke, denormaliserer du dine borde?
- Tænk ikke engang på at bruge MyISAM, som lider mindre af disse problemer, det er ikke optimeret til multi-join-databaser og understøtter ikke referentiel integritet eller transaktioner og passer dårligt til denne arbejdsbyrde.
- Når du bruger en sammensat nøgle, kan du kun bruge den yderste højre del af nøglen, dvs. du kan ikke bruge
floor_id
i tabelbed
andet end at brugeid+building_id+floor_id
, Det betyder, at du muligvis skal bruge meget mere nøglerum end nødvendigt i Model A. Enten det, eller også skal du tilføje et ekstra indeks (som vil trække rundt i en hel kopi af PK).
Kort sagt
Jeg ser absolut ingen fordele og en masse ulemper ved Model B, brug den aldrig!