sql >> Database >  >> RDS >> Mysql

Bulletin board - Database-optimalisatie

Deel I

Herzien 09 december 10 01:00 EST

Heb je DDL bekeken. OK. We moeten eerst een stapje terug doen en uw database ordenen. Dat lost de helft van uw problemen op (uw SQL is eenvoudig, en snel, minder indexen, geen tijdelijke tabellen vereist). Een tijdje dacht ik, aha, je hebt je kolommen, het moet stabiel zijn, maar er is geen kans. Top-down vanaf nul, oké. Kijk eens naar dit Entiteitsrelatiediagram (het heeft geen zin om aan het gegevensmodel te werken, namelijk Entiteiten, Relaties en Attributen , totdat we de ER's goed hebben), en controleer of het correct is.

  • De manier om dat te doen is door de volgende vragen te beantwoorden (korte antwoorden zijn prima). Deze vragen verduidelijken de Entiteiten en bedrijfsregels . Hoe u databases in het algemeen en uw gegevens in het bijzonder begrijpt, is cruciaal. Je hebt een lange weg afgelegd, alleen, dus vanaf daar kunnen we het overnemen.

  • Ik denk dat ▶dit bericht◀ kan nuttig voor u zijn om de formele fasen te begrijpen die moeten worden gevolgd; die we hier kortsluiten.

  • Het belangrijkste, volledig en volledig, vergeet de functie en eventuele coderingsvereisten. Gegevens moeten onafhankelijk van de toepassing worden gemodelleerd, gewoon als gegevens. Functiemodellering is een andere wetenschap. Zorg er eerst voor dat er een goed is; dan krijg je de andere goed; en de twee spelen samen prachtige deuntjes. Probeer ze samen te jammen; beide taken tegelijkertijd doen, en ze zullen niet eens een garageband in de voorsteden vormen.

Kortheidshalve, en in het belang van iedereen die dit leest, gebruik ik een gesloten en open sectie; wanneer een Open item (discussie) wordt gesloten, zal ik het beknopt maken en naar het gedeelte Gesloten verplaatsen. Handhaaf de nummering, want soms komen dingen terug om ons te achtervolgen. Misschien wil je hetzelfde doen, of zelfs de discussie aan jouw kant verwijderen.

De links voor de mooie foto's staan ​​aan het einde.

Excuses:de bewerking werkt niet; subnummering is inconsistent

Gesloten problemen

  1. users.bb_locations_csv is een veel-op-veel relatie tussen gebruikers en locaties:
    • Elk van deze elementen moet een vermelding zijn in een afzonderlijke kolom, in een afzonderlijke rij
    • Eén gebruiker kan veel locaties hebben en 1 locatie kan veel gebruikers hebben is veel-op-veel
    • Lees ▶dit bericht◀ voor een bespreking van hoe dat wordt behandeld en in welke fase het wordt behandeld
    • In deze logische fase is dat slechts een n::n-relatie, zoals ik heb getekend, je kunt het voorlopig vergeten, het zal eenvoudig worden geleverd wanneer we bij het fysieke stadium komen.
    • Vertrouw me, ik zal code leveren die niet complexer is dan ...WHERE IN () voor uw aangegeven doel.
    • Bij nader inzien, als ik je vingers breek, typ je nog langzamer, dus dat kan ik beter niet
    • Ok, je app is browsergebaseerd en de pagina is dynamisch (mijn advies was voor statische pagina's die moeten worden bijgewerkt); ga je gang met selectievakjes.
      .
  2. users.bb_categories_csv is een veel-op-veel relatie tussen gebruikers en categorieën
    • Idem.
      .
  3. Bevestigd:een bulletin (bbs) bestaat niet zonder een gebruiker; een gebruiker geeft een bulletin uit, en dat begint de hele cyclus; nodigt vervolgens antwoorden en beoordelingen uit.

    3.1 Bevestigd:er is eigenlijk maar één prikbord en het bestaat niet als een ding in de database.

    3.2 Bevestigd:dat de organisatie nooit meer dan één bulletinboard zal hebben, en de classificaties en categorisaties worden allemaal adequaat afgehandeld door de categorietabel/functie

  4. verwijderd.

  5. Bevestigd:het verschil tussen bulletins en antwoorden is dat antwoorden afhankelijk zijn van het bestaan ​​van een bulletin, geen titel hebben en niet zijn gecategoriseerd op locatie of categorie omdat ze afhankelijk zijn van het bestaan ​​van het bulletin zelf.

  6. Verwijderd.

  7. Opmerkingen genoteerd. Opgelost.

7.1. Voor elk afzonderlijk bulletin dat door een andere gebruiker is ingediend, kan elke gebruiker meer dan één antwoord plaatsen.

7.2. Voor elk afzonderlijk bulletin dat door een gebruiker wordt ingediend, kan die gebruiker één of meer reacties plaatsen.

7.3. Verwijderd.

7.4. Verwijderd.

.
8. Bevestigd:elke gebruiker kan maximaal één beoordeling in een bulletin plaatsen (die kan worden ingetrokken/gewijzigd)
.
9. Bevestigd:elke gebruiker kan maximaal één beoordeling op een antwoord plaatsen (idem)

10.1. Gegeven:gebruikersnaam komt van de organisatie en is de unieke naam die medewerkers identificeert. E-mails zijn bijvoorbeeld [email protected] - authenticatie wordt gedaan met ldap en dit is vereist om verbinding te maken en andere informatie over de werknemers op te halen

  • Bevestigd:gebruikersnaam is een uitstekende identificatie

10.2. Bevestigd:Voornaam, Achternaam ... Geboorteplaats, etc blijven als (de traditionele) kolommen om People te verzekeren worden niet gedupliceerd.
.
11. Gegeven:Op dit moment kunnen we onze kantoren identificeren met informele namen die algemeen bekend zijn binnen de organisatie, aangezien we slechts ongeveer 3 hoofdkantoren en veel veldkantoren hebben. Dus voorbeelden zijn Washington DC of een veldkantoor in Virginia. In totaal denk ik dat we zullen proberen het totaal onder de 20 te houden. Ik wil ook het exacte adres van elke locatie vastleggen, omdat dat kan worden gebruikt om kantoren op unieke wijze voor gebruikers te identificeren.

  • Geleverd:StateCode+Town als PK; IsMainOffice als booleaans.

.
12. Bevestigd:Description en Name voor Category zijn vereist.
.
13. Gegeven:gebruikers kunnen in sommige categorieën geen berichten plaatsen. Alleen gebruikers met voldoende hoge rechten hebben het recht om in bepaalde categorieën te posten.

  • Op voorwaarde:Permission in User, Location, Category is een methode om dergelijke rechten te evalueren.

.
14. Bevestigd:Location.Administrator is UserId van admin voor de Location .
.
15. Gegeven:Er zal alleen maar behoefte zijn aan een voorkeur of een afkeer. Ik denk niet dat er een neutrale positie hoeft te zijn, omdat dit hetzelfde is als gewoon niet stemmen? Liken lijkt relevanter voor bulletin-antwoorden die posten om eerlijk te zijn. Dwz 'ik zie uw reactie en in plaats van mijn eigen te schrijven, zal ik het gewoon met u eens zijn - het bestaande prikbord is enigszins een sociaal aspect in de organisatie en ik denk dat het leuk vinden en niet leuk vinden/eens en oneens is, een niveau van controverse creëert dat deelname aanmoedigt . Het is echter niet altijd helemaal gepast om een ​​bulletin leuk of niet leuk te vinden.

15.1 Mits:Like als boolean in BulletinRating en ResponseRating . Dit vereist interpretatie bij elke toegang.
15.2. Als het niet langer een boolean is, kan het worden gewijzigd in een RatingCode , en geïmplementeerd als een opzoektabel. De namen worden vervolgens bepaald door Joins en interpretatie wordt geëlimineerd. Ik heb dit getekend in het First Data Model, zodat je kon zien wat ik bedoelde15.3. Verwijderd in het tweede gegevensmodel.
.
16. Bevestigd:elke gebruiker heeft een thuis Location (anders dan de lijst met Locations waarin ze geïnteresseerd zijn).
.
17. Bevestigd:Permission volgens (13).
.
18. Bevestigd:volgens het gegevensmodel zijn mogelijk meer machtigingen vereist.

18.1. Als u dit nu doet, hoeft u zich geen zorgen te maken wanneer de organisatie besluit een bepaalde Person te weren van het plaatsen van Responses of Bulletins , of ze beoordelen; en wil die functie gisteren geïmplementeerd hebben.

18.2. Zelfs als u het niet implementeert, laat dan ruimte tussen de waarden die u wel implementeert.
.
19 Bevestigd:een Bulletin gaat over een Location .

19.1. Bevestigd:er zijn geen Bulletins zonder een Location

19.2. Bevestigd:er zijn geen Bulletins zonder een Location .

19.3 Bevestigd:er zijn geen Bulletins zonder een User (declaratief). Maar tot nu toe hebben we geen manier om die User . te beperken; daarom elke User kan een Bulletin invoegen voor elke Location (je zou het in code kunnen beperken, bijv. tot Locations elke User Is Interested In .

19.4 Bevestigd:er zijn geen BulletinRatings zonder een Bulletin en een beoordeling User .

19.5 Bevestigd:Er zijn geen Responses zonder een Bulletin .

19.4 Bevestigd:er zijn geen ResponseRatings zonder een Response en een beoordeling User .

19.7. Maar er kunnen Users . zijn , Locaties, and Categorieën`, onafhankelijk.

.
20. Als je het niet erg vindt, zal ik naamconventies geven, enz. Ze zouden voor zichzelf moeten spreken en de waarde zal alleen verschijnen als je begint met het coderen van SQL. Vraag ernaar als er iets niet is. Om te beginnen zijn alle namen enkelvoud. Gemengde hoofdletters is gemakkelijker te lezen (u wordt verondersteld hoofdletters te gebruiken voor SQL-taal).

20.1. Mijn ervaring is dat table_name, in tegenstelling tot tableName, echt technische vormen zijn, en gebruikers houden er niet van; Consistent gemengd geval is geliefd bij iedereen. Het is een van die dingen die onmogelijk te veranderen zijn, dus kies zorgvuldig.
.
21. Houd er rekening mee dat dit een fysiek probleem is als u tabellen wilt groeperen, wat goed is. Op het niveau van het Logische gegevensmodel hebben de tabellen normale namen, zonder fysieke problemen. Stel je voor dat de fysieke tabellen worden voorafgegaan door iets als (en gebruik hiervoor hoofdletters):
- REF_ ter referentie (zoals Gebruiker) en opzoektabellen
- BUL_ voor Bulletin-systeem
.
Ik kan geen tabellen met hoofdletters noemen? Ik weet niet zeker waarom. Ik weet niet waarom ik geen tabelnamen in hoofdletters mag hebben. Heeft het te maken met het gebruik van MyIsam-databasetabellen?

.
22. rank (alle) kunnen direct uit de database worden afgeleid (onthoud, maak je geen zorgen over de code tijdens Data Modelling). Als u het opslaat, is het een normalisatiefout; een gedupliceerde kolom; die up-to-date moet worden gehouden; die uit de pas kan lopen met de afgeleide waarde; wat een Update Anomaly wordt genoemd. Vijfde normale vorm elimineert updateafwijkingen. Dat is mijn minimumniveau van Normalisatie, dus dat krijg je van mij.

22.1. Ik bemoei me helemaal niet met de sorteervolgorde of populariteitskwestie; in feite, zo te horen, heb je die functionaliteit niet gesloten. Ik neem alleen overtollige gegevens, de rang kolom , uit, als onderdeel van het normalisatieproces.

22.2. Hier is een ▶Quick Tutorial◀ op de operator RANK() (zoals algemeen bekend). Het is geen ANSI SQL; het is een Oracle- en MS-extensie. Het is echter niet vereist als u subquery's begrijpt, daarom heeft Sybase het niet. Ik betwijfel of MySQL het heeft, dus je moet er je hoofd omheen draaien. Het begrijpen van scalaire subquery's is een eerste vereiste. Syntaxis van Sybase, dus sla je puntkomma's erin, enz. Voel je vrij om specifieke vragen te stellen.
.
Ik heb nog nooit zo'n benadering gezien van het schrijven van Rank =(SELECT.... Is dat hetzelfde als (SELECT ...) als Rang?

.
22.3. Behoefte om te begrijpen waarom, is helemaal geen probleem. Alleen kinderen volgen blindelings simpele regels, en jij bent daar zeker niet een van.
.
23. Bevestigd:users.total_bulletins is overbodig; het kan worden afgeleid. Verwijderd.
.
24. Al uw PK's zijn ID's. Ben je het nog niet zat om in de code te verdwalen? Vergeet het plakken van Id iot PK's op alles wat beweegt, laten we eens kijken hoe uw gebruikers Identificeer hun entiteiten; welke entiteiten werkelijk onafhankelijk zijn en de andere die afhankelijk zijn van onafhankelijke entiteiten.

24.1. Gebruik nooit Id of een dergelijke vorm. Als het een PK is, gebruik dan het volledige formulier.

24.2. Bel location_id, location_id, waar het ook is, inclusief de PK-tabel. De uitzondering is wanneer u de rol moet tonen. Dit wordt duidelijk in het Data Model.
.
25. Je hebt geen Declarative Referentiële Integriteit, geen Gedefinieerde Buitenlandse sleutels. Dat is om veel verschillende redenen slecht nieuws. Zodra deze vragen zijn opgehelderd, voeg ze dan toe. DRI betekent dat zoveel mogelijk, zo niet alle, integriteit wordt verklaard in SQL. De ISO/IEC/ANSI SQL-standaard maakt dit mogelijk, maar het freeware-uiteinde van de markt biedt niet de standaard en haalt langzaam zijn achterstand in. Dit betekent dat de server niet toestaat dat een rij in de FK-tabel wordt toegevoegd, tenzij de PK in de bovenliggende tabel bestaat. MySQL heeft onlangs DRI voor Foreign Keys geleverd. Raadpleeg voor FK's ▶ dit artikel◀ .

25.1. Voor CHECK-beperkingen en RULES moet u deze in code implementeren.

mijn externe sleutels zijn als, users-id(fk) =users.id(pk) Ik weet niet zeker hoe ik ze moet toevoegen, behalve wat ik heb gedaan, maar zal dat zeker doen zodra ik weet hoe.

Vijfentwintig. Opmerkingen genoteerd. Ik ben geen MySQL-specialist. Ja, dat zijn de dingen die je zelf moet uitzoeken. Over het algemeen is MySQL, als ik het doorlees, pootloos; voor alles wat SQL-achtig is, heb je InnoDB nodig.

.
27. Gegeven:Ik heb de sorteervereisten voor bulletin opnieuw bekeken. Gebruikers kunnen chronologisch sorteren - eenvoudig, logisch. Gebruikers konden bulletins sorteren op de datum van het laatste antwoord op het bulletin. Dan kunnen we de rangorde vergeten en zou het heel gemakkelijk moeten zijn om bulletins chronologisch te sorteren op de tijd van hun laatste reactie? Wat zijn je gedachten.

Openstaande problemen

(Nul)

Gegevensmodel

Oké, ervan uitgaande dat je geen problemen hebt met de ERD en alle gesloten problemen implementeert, heb ik de gegevens gemodelleerd en een Vijfde gegevensmodel 09 december 10 opgesteld voor uw recensie. Ik heb zeker veel meer nodig feedback, vragen, etc. hierover. Ik heb moeite om te accepteren dat het gedaan is. Waarschijnlijk het beste om echte code te schrijven voor uw probleemgebieden.

Links

▶Link naar IDEF1X-notatie◀ U moet dit echt lezen en begrijpen voordat u het gegevensmodel leest.

▶Link naar gegevens van het vijfde bulletin Model◀ Het Entiteitsrelatiediagram staat op de eerste pagina, gevolgd door het Gegevensmodel .

  • De sleutels zijn vrijwel recht IDEF1X (behalve voor UserId die ik als contrapunt heb verstrekt); wat betekent portemonnee relationele sleutels. Niet verbeterd en niet geoptimaliseerd voor fysieke overwegingen. Merk ze eerst op, registreer ze en evalueer ze voordat je ze tegen je in het harnas jaagt. Natuurlijk kunnen we toevoegen Id iot-sleutels, maar voordat we dat doen, moeten we ervoor zorgen dat we begrijpen wat we gaan verliezen.

  • Let op de ID's (ononderbroken lijnen) volgens het notatiedocument. De wervelkolom, de wervels van het systeem is Location ... Bulletin ... Response .

  • Merk op dat Keys veel bedrijfsregels implementeert.

  • Let op de natuurlijke hiërarchie die ik heb weergegeven. Kijk of het iets voor jou betekent.

  • De werkwoordzinnen zijn erg belangrijk; kijk of ze iets betekenen.

Opmerkingen over het eerste gegevensmodel en reacties

Een vraag die ik heb is dat de primaire sleutel van de locatie zal worden gebruikt om de onderliggende primaire sleutel te vormen? (ze zijn verbonden door een ononderbroken lijn) Ik begrijp dat concept niet echt

  • Wat is een goede identificatie voor Bulletin? , wat gebruiken uw gebruikers natuurlijk om een ​​bulletin te identificeren ...
  • "heb je het bulletin van Virginia FO gisteren gezien?",
  • "Sally uit Washington schrijft zeker goede bulletins", enz.

of waarom bestaat die relatie niet tussen de gebruiker en het bulletin?

  • Zoals hierboven vermeld, zal ik, aangezien ik Rating nu als een tabel heb getoond en wat de weergave zou zijn, een keer verwijderen

  • Ik denk dat Toestemming een Entiteit zou moeten zijn.

  • Bulletin PK is nu (StateCode, Town, UserId, SequenceNo) . Voor alle duidelijkheid:SequenceNo is binnen StateCode, Town, UserId :het wordt 5 voor Sally's 5e bulletin over MO/Billngs FO.

  • Merk op dat gebruikersinstellingen BulletinsPerPage ,etc, zijn 1::1 met User , dus ze staan ​​in User; kindertabel zou onjuist zijn.

  • Typografische fouten gecorrigeerd.

Opmerkingen bij tweede gegevensmodel en antwoorden

  • De PK's voor beide Bulletin en Response zijn gewijzigd om weer te geven (7). BulletinNo en ResponseNo zijn vervangen door BulletinDate en ResponseDate (dat was CreatedDate ), om meerdere antwoorden toe te staan ​​per User per Bulletin .

Opmerkingen over het derde gegevensmodel en antwoorden

Vertrouw erop dat je een goede vakantie hebt gehad.

  1. Minstens 30 jaar geleden (voor zover ik weet) hadden de reuzen in de industrie dit debat. Namen zijn altijd enkelvoud. Tabellen zijn zelfstandige naamwoorden. WerkwoordZinnen zijn werkwoorden. Dit is niet beperkt tot db-naamgevingsconventies, het is van toepassing op documenten, scripties, proefschriften, enz. U kunt 5 conclusies aan het einde van het document hebben, maar de titel van de sectie of het hoofdstuk, zowel in de inhoudsopgave als bovenaan de pagina is "Conclusie".

    Nadat ik ze helemaal door Uni had gevochten, zodra ik aan mijn eerste betaalde programmeerbaan begon en het belang van de regels in de echte wereld zag, in tegenstelling tot de theoretische argumenten die we op de universiteit hadden, gaf ik het op als een verspilling van tijd. Al die tijd en energie die ik verspilde, kwam vrij om productief werk te doen. Sindsdien twijfel ik niet meer aan de reuzen; Ik accepteer het gewoon. Dat hun geest groter is dan de mijne. Het is als het accepteren van Normen, of je gedragen binnen de wet, of God. Ik heb geen echt, hele goede redenen om iets illegaals te doen.

    Hoe dan ook, het gemak van taalgebruik (discussie, SQL, documentatie) dat door dergelijke regels wordt ondersteund, kan niet adequaat worden uitgelegd; naarmate je meer en meer SQL-code schrijft, wordt het duidelijk.

    Je bent altijd vrij om te gebruiken wat je wilt. Ik lever alleen enkelvoud.

  2. Prima met mij.

    Maar u moet er rekening mee houden dat die twee elementen, in de geïdentificeerde volgorde (ofschoon niet-PK Unieke Index of Alternatieve Sleutel) universeel vereist zijn om Uniciteit voor een Persoon vast te stellen. Als u ze verwijdert, resulteert dit in twee dingen. Ten eerste kunt u de uniciteit van Users niet langer identificeren (en dus kunt u dubbele rijen hebben). Ten tweede wordt de AK niet-uniek, een Inversion Entry.

  3. Het punt is (in tegenstelling tot een van de berichten), elke kolom die 1::1 is met deUser PK, moet zich bevinden inUser . Alle voorkeursinstellingen. Sinds we deInterestedLocations . hebben opgeruimd enInterestedCategories , ik ken alleen BulletinsPerPage overig; maar ik weet zeker dat er anderen zijn. IsPreference2 is een bijv. van een boolean;NumPreference3 is een bijv. van een geheel getal. Enz. Je kunt me vertellen wat de echte voorkeuren zijn.

    (Laten we dat eens in het meervoud proberen:... elke kolom die 1::1 is met deUsers PK, moet zich bevinden inUsers . Doet het gewoon niet voor mij, ik blijf hangen in het gebroken Engels, en ik ben een beetje kostbaar over mijn moedertaal.)

    Gegevensmodel bijgewerkt.

  4. Uitmuntend. Laat me weten wanneer je je daar prettig bij voelt, en ik zal je het fysieke model geven.

    Hoe zit het met de werkwoordzinnen?

Reacties over 06 Dec 10 20:38 EST (Kleine Updates)

.
28. Waar PK slechts één keer voorkomt als een FK, is de FK-kolomnaam natuurlijk hetzelfde als de PK-kolomnaam. Wanneer er echter meer dan één occ van de FK is (kijk op ResponseRating ), zijn er drie UserIds ), moeten we ze onderscheiden. In IDEF1X-terminologie wordt dit Rollen genoemd. De rol van de User die het Bulletin heeft uitgegeven is Issuer , enzovoort. Het is duidelijk beter om die naam te gebruiken en consistent te houden in de hele hiërarchie (niet UserId in Bulletin en dan wanneer we bij Response . komen , waar er twee zijn en differentiatie vereist is, wijzigt u dit in IssuerId . Ik dacht dat je daar misschien een probleem mee zou hebben; in de vroege stadia is het gebruik Issuer.UserId zodat het absoluut duidelijk is dat het UserId . is als een FK, en de rol is Issuer; wanneer we bij het fysieke model komen, wordt het vereenvoudigd tot IssuerId .

Evenzo hebben we veel DateTime-kolommen (afgekort Date als je wilt; anders Dtm), die moeten worden onderscheiden.
.
29. Klopte het IDEF1X Notation-document niet?

  • De PK voor elke tafel staat boven de lijn, in de opgegeven volgorde.
  • Vergeet niet dat we de PK's van de bovenliggende tabellen hoe dan ook dragen, en als er betekenis is, die FK's gebruiken om de onderliggende PK te vormen.
  • Voor Bulletin :

    • De locatie FK (StateCode, Town) waarvoor het is uitgegeven
    • De UserId van de Emittent
    • en DateTime het is uitgegeven, om het uniek te maken.
    • daarom (StateCode, Town, IssuerId, BulletinDate)`
  • Om alle ResponseRatings te verwijderen voor dit Bulletin , gebruik WHERE = op die vier Bulletin kolommen.

.
30. Omdat (State, Town) is de PK van Location , overal mee naartoe nemen. En het maakt deel uit van het Bulletin PK, dus alle afhankelijke tabellen dragen die kolommen omdat ze het Bulletin . dragen PK.

We hadden eerder vastgesteld dat (State, Town) is de PK, Ik laat dat zoals het is Raadpleeg (38) voor wijzigingen.

.
33. Discussie waard. Ja, als u het gaat weergeven bij (bijv.) het weergeven van Responses , en de gebruikers begrijpen UserName . Nee, als het 30 bytes is, en er is ook een unieke 4 byte UserId . Het idee is om deze keuzes bewust te maken, bewust van wat je opgeeft, wanneer je uiteindelijk besluit dat een 6-koloms 30-byte sleutel te omslachtig is om naar de kinderen te migreren.

  • Ik heb in het begin aangegeven dat ik UserId . zou gebruiken als een typische Id Pk, omdat het wordt gedragen/gemigreerd naar verschillende onderliggende tabellen.
  • We kunnen laten hoe dat is gemaakt voor later. Maar het is een pure Surrogaat PK.

.
34. Geen probleem. Category heeft het al. Ik verander Order naar ListOrder .

.
35. Zeker. Op basis van wat ik heb gelezen en gehoord, ben ik er best blij mee. Maar ik zou graag wat meer heen en weer willen om wat vertrouwen te krijgen, voordat je code schrijft. Of bekijk het als een leerervaring en accepteer dat het model en de code later kunnen veranderen. Wil je dat ik de Physical nu produceer? Als u mij alle correcties geeft, zal ik de volgende versie publiceren. Ik verwacht voorkeuren in User . Loop ook snel door de functies en controleer of je alle kolommen hebt die je nodig hebt.

Kijk naar enkele van de andere antwoorden, met het oog op leren en interesse.

.
36. Doet mee. Je doet gewoon mee op four drie kolommen in plaats van één. SQL is omslachtig met joins, en de nieuwe syntaxis die het gemakkelijker moest maken, is eigenlijk omslachtiger. Mijn programmeurs schrijven nooit joins:we besparen tijd en typefouten. Ik heb een proc die twee of meer tabellen geeft, de code genereert met alle kolommen en joins. Ik weet niet genoeg van MySQL om dat voor je om te zetten.

Gegevensmodel bijgewerkt.
.

Opmerkingen over 10 december 20:49, vierde gegevensmodel en antwoorden

.
Controleer de vorige sectie direct hierboven, er zijn kleine updates.

IDEF1X:Je snelheid is prima.

Let op het kind altijd "erft" de ouder-PK, als een FK (ofwel ononderbroken of onderbroken lijn), anders is er geen relatie tussen hen. Door deze kolommen, die toch al in het kind aanwezig zijn, te gebruiken om de PK van het kind te vormen, dragen we de betekenis (en dat is het verschil tussen vast en kapot). En dus hoeven we niet te zoeken naar een onafhankelijke Identifier voor het kind. De relationele kracht in deze methode zal later duidelijk worden, wanneer je aan het coderen bent.

Het gedeelte waar we mee te maken hebben, gaat over Identifiers :natuurlijk versus onnatuurlijk; zinvol vs zinloos. Later zul je zien hoe we het relationele vermogen van de motor kunnen gebruiken, wanneer het kind-PK wordt gevormd uit het ouder-PK. (Is je achternaam niet hetzelfde als die van je vader?)

Het is ook belangrijk om relationele databases en hun mogelijkheden te begrijpen. Dat gaat verloren wanneer we de database (bijv.) benaderen vanuit een OO-perspectief, en het behandelen als een locatie om onze klassen "persistent" te maken. Daarom zullen we proberen relationele termen te leren en te gebruiken. Het wordt moeilijk als je naar Frankrijk gaat en verwacht dat ze Amerikaans spreken en dezelfde valuta gebruiken; leer 10 woorden Frans spreken, en ze verwelkomen je met open armen, en je zult een heel andere ervaring hebben met de lokale bevolking.

Ga in ieder geval door met het implementeren van het model. Realiseer je dat we op een gegeven moment waarschijnlijk een verandering zullen doorvoeren. Sla al uw DDL op. Sla al uw testgegevens op als invoeginstructies of als tabelback-up of export van tekenformaat (geen idee wat MySQL op dit gebied wel/niet kan doen).
37.1. Behandeld, de n::n relatie met Office &Category . Dat zul je pas "zien" als we bij het fysieke model komen.

37.2. Klaar.

37.3 Klaar.
.
38. Uitmuntend. Korter ook. Merk op dat ze nooit twee Offices kunnen hebben in dezelfde postcode. NUMERIC(5,0) is goed, maar ik dacht dat de VS op weg was naar 7 cijfers. Maakt niet uit, je kunt het uitzoeken; het is een uitstekende PK voor Office . Nu deze kolom, die deel uitmaakte van Address , waarschijnlijk ZipCode , is verheven tot een hoger doel, zonder duplicatie; aangezien we het in 5 onderliggende tabellen hebben en we willen dat de PK-naam duidelijk is, zoals eerder uitgelegd in de conventies, zullen we het OfficeCode noemen; OfficeZipCode is misschien dom.

We hebben een unieke index nodig op Name om ervoor te zorgen dat ze niet twee Offices . toevoegen met dezelfde naam. Let op, voor uitlegdoeleinden is dit eigenlijk de logische sleutel van Office , ter vervanging van (StateCode, Town) , en dat blijft zo.

Ik denk nog steeds dat je StateCode nodig hebt en Town als snelle referentie (anders dan ergens in Address te zitten) )

Gegevensmodel bijgewerkt, vijfde nu beschikbaar voor beoordeling. U heeft uw voorkeur niet aangegeven, voor ...Date vs ...Dtm . Ik ga met het laatste mee, omdat het meer specifiek is, en ook de tijdcomponent identificeert. Makkelijk te veranderen.

Dit antwoord heeft de maximale lengte bereikt. Vervolg in "Deel II"



  1. Vind entiteiten waarnaar wordt verwezen in SQL Server:sys.dm_sql_referenced_entities

  2. PostgreSQL-beveiliging standaardiseren in multi-cloudomgevingen

  3. docker-compose:MySQL db elke keer opnieuw initialiseren

  4. Kan de kolom die wordt gebruikt in een externe sleutelbeperking niet wijzigen