Część I
Poprawione 09 grudnia 10, 01:00 EST
Spojrzałem na twoje DDL. Ok. Musimy cofnąć się o krok i najpierw uporządkować Twoją bazę danych. To rozwiąże połowę twoich problemów (Twój SQL będzie prosty; i szybki; mniej indeksów; nie są wymagane tabele tymczasowe). Przez chwilę myślałem, aha, masz swoje kolumny, musi być stabilnie, ale nie ma szans. Z góry na dół od zera, ok. Spójrz na ten diagram relacji encji (nie ma sensu pracować nad modelem danych, czyli encjami, relacjami i atrybutami , dopóki nie uzyskamy poprawnego ER) i sprawdź, czy jest poprawne.
-
Aby to zrobić, odpowiedz na następujące pytania (krótkie odpowiedzi są w porządku). Te pytania wyjaśniają Podmioty i reguły biznesowe . To, jak ogólnie rozumiesz bazy danych, a Twoje dane w szczególności, ma kluczowe znaczenie. Przebyłeś długą drogę na własną rękę, więc możemy to zrobić.
-
Myślę, że ▶ten post◀ mogą być pomocne w zrozumieniu formalnych etapów, które należy wykonać; które tutaj zwieramy.
-
Co najważniejsze, całkowicie i całkowicie zapomnij o funkcji i wszelkich wymaganiach dotyczących kodowania. Dane muszą być modelowane niezależnie od aplikacji, po prostu jako Dane. Modelowanie funkcji to inna nauka. Najpierw zdobądź jeden dobrze; następnie zdobądź drugie prawo; i obaj razem grają piękne melodie. Spróbuj zakleszczyć je razem; wykonując oba zadania w tym samym czasie, a nawet nie stworzą podmiejskiego zespołu garażowego.
Dla zwięzłości i dla każdego, kto to czyta, używam Sekcji Zamkniętej i Otwartej; kiedy element otwarty (dyskusja) jest zamknięty, zwięźle go i przeniosę do sekcji Zamknięte. Utrzymuj numerację, bo rzeczy czasami nas nawiedzają. Możesz zrobić to samo, a nawet usunąć dyskusję po swojej stronie.
Linki do ładnych zdjęć znajdują się na końcu.
Przeprosiny:edycja nie działa; podnumerowanie jest niespójne
Zamknięte problemy
- users.bb_locations_csv to relacja wiele-do-wielu między użytkownikami a lokalizacjami:
- Każdy z tych elementów powinien być wpisem w dyskretnej kolumnie, w dyskretnym wierszu
- Jeden użytkownik może mieć wiele lokalizacji i 1 lokalizacja może mieć wielu użytkowników to wielu do wielu
- Przeczytaj ▶ten post◀ na dyskusję o tym, jak to jest traktowane i na jakim etapie się to robi
- Na tym etapie logicznym jest to po prostu relacja n::n, jak narysowałem, możesz na razie o tym zapomnieć, zostanie ona po prostu dostarczona, gdy dojdziemy do etapu fizycznego.
- Zaufaj mi, dostarczę kod, który nie jest bardziej skomplikowany niż
...WHERE IN ()
w zadeklarowanym celu. - Po namyśle, jeśli złamię ci palce, będziesz pisał jeszcze wolniej, więc lepiej nie
- Ok, Twoja aplikacja jest oparta na przeglądarce, a strona jest dynamiczna (moja rada dotyczyła stron statycznych, które należy poprawić); śmiało zaznacz pola wyboru.
.
- users.bb_categories_csv to relacja wiele-do-wielu między użytkownikami a kategoriami
- Tak samo.
.
- Tak samo.
-
Potwierdzone:biuletyn (bbs) nie istnieje bez użytkownika; użytkownik wydaje biuletyn i to rozpoczyna cały cykl; następnie zaprasza odpowiedzi i oceny.
3.1 Potwierdzono:Tak naprawdę jest tylko jedna tablica ogłoszeń i nie istnieje jako Rzecz w bazie danych.
3.2 Potwierdzono:organizacja nigdy nie będzie miała więcej niż jednej tablicy ogłoszeń, a klasyfikacje i kategoryzacja są odpowiednio obsługiwane przez tabelę/funkcję kategorii
-
Usunięto.
-
Potwierdzone:różnica między biuletynami a odpowiedziami polega na tym, że odpowiedzi są zależne od biuletynu, nie mają tytułu i nie są kategoryzowane według lokalizacji lub kategorii, ponieważ ich istnienie jest zależne od samego biuletynu.
-
Usunięto.
-
Zanotowano uwagi. Rozwiązany.
7.1. W przypadku każdego biuletynu przesłanego przez innego użytkownika każdy użytkownik może opublikować więcej niż jedną odpowiedź.
7.2. W przypadku każdego biuletynu przesłanego przez użytkownika, użytkownik ten może opublikować jedną lub więcej niż jedną odpowiedź.
7.3. Usunięto.
7.4. Usunięto.
.
8. Potwierdzone:każdy użytkownik może opublikować maksymalnie jedną ocenę w biuletynie (którą można unieważnić/zmienić)
.
9. Potwierdzone:każdy użytkownik może opublikować maksymalnie jedną ocenę w odpowiedzi (jak wyżej)
10.1. Biorąc pod uwagę:nazwa użytkownika pochodzi z organizacji i jest unikalną nazwą identyfikującą pracowników. Na przykład e-maile to [email protected] - uwierzytelnianie odbywa się za pomocą ldap i jest wymagane do połączenia i pobrania innych informacji o pracownikach
- Potwierdzono:nazwa użytkownika to doskonały identyfikator
10.2. Potwierdzone:FirstName, LastName ... BirthPlace itp. pozostają jako (tradycyjne) kolumny, aby zapewnić, że People
nie są duplikowane.
.
11. Biorąc pod uwagę:W tej chwili możemy zidentyfikować nasze biura pod przypadkowymi nazwami, które są ogólnie znane w organizacji, ponieważ mamy tylko około 3 główne biura i wiele biur terenowych. Przykładami mogą być Waszyngton DC lub biuro terenowe w Wirginii. W sumie myślę, że postaramy się utrzymać sumę poniżej 20. Chcę również zapisać dokładny adres każdej lokalizacji, ponieważ może to być użyte do jednoznacznej identyfikacji biur dla użytkowników.
- Dostarczone:
StateCode+Town
jako PK;IsMainOffice
jako wartość logiczna.
.
12. Potwierdzone:Description
i Name
dla Category
są wymagane.
.
13. Biorąc pod uwagę:Użytkownicy nie będą mogli publikować w niektórych kategoriach. Tylko użytkownicy z odpowiednio wysokimi uprawnieniami będą mieli prawo do publikowania w określonych kategoriach.
- Dostarczono:
Permission
wUser, Location, Category
jest metodą oceny takich praw.
.
14. Potwierdzono:Location.Administrator
to UserId
administratora dla Location
.
.
15. Biorąc pod uwagę:Zawsze będzie potrzeba tylko upodobania lub niechęci. Nie sądzę, że musi istnieć neutralne stanowisko, bo to jest to samo, co niegłosowanie? Polubienie wydaje się bardziej istotne w przypadku odpowiedzi na biuletyny, w których posty są szczere. To znaczy „widzę twoją odpowiedź i zamiast pisać własną, po prostu się z tobą zgadzam – istniejąca tablica ogłoszeń jest poniekąd aspektem społecznym w organizacji i myślę, że lubienie i nielubienie / zgadzanie się i nie zgadzanie się stwarza poziom kontrowersji, który zachęca do uczestnictwa . Jednak lubienie lub nielubienie biuletynu może nie zawsze być właściwe.
15.1 Dostarczono:Like
jako wartość logiczna w BulletinRating
i ResponseRating
. Będzie to wymagało interpretacji przy każdym dostępie.
15.2. Gdy nie jest już wartością logiczną, można ją zmienić na RatingCode
i zaimplementowane jako Tabela przeglądowa. Nazwy są następnie określane przez Sprzężenia, a interpretacja jest eliminowana. Narysowałem to w Pierwszym Modelu Danych, żebyście mogli zobaczyć, o co mi chodzi 15.3. Usunięto w Drugim modelu danych.
.
16. Potwierdzono:każdy użytkownik ma domową Location
(inne niż lista Locations
które ich interesują).
.
17. Potwierdzone:Permission
zgodnie z (13).
.
18. Potwierdzono:mogą być wymagane dalsze uprawnienia, zgodnie z modelem danych.
18.1. Jeśli zrobisz to teraz, nie będziesz musiał się martwić, kiedy organizacja zdecyduje się zapobiec określonej Person
od opublikowania Responses
lub Bulletins
lub Ocena ich; i chce, aby ta funkcja została wdrożona wczoraj.
18.2. Nawet jeśli go nie zaimplementujesz, zostaw przerwy między wartościami, które zaimplementujesz.
.
19 Potwierdzono:Bulletin
jest o Location
.
19.1. Potwierdzone:nie ma Bulletins
bez Location
19.2. Potwierdzone:nie ma Bulletins
bez Location
.
19.3 Potwierdzono:nie ma Bulletins
bez User
(deklaracyjny). Ale jak dotąd nie mamy możliwości ograniczenia tego User
; dlatego każdy User
może wstawić Bulletin
dla dowolnej Location
(możesz ograniczyć to w kodzie, np. do Locations
każdy User Is Interested In
.
19.4 Potwierdzone:nie ma BulletinRatings
bez Bulletin
i ocenę User
.
19.5 Potwierdzone:nie ma Responses
bez Bulletin
.
19.4 Potwierdzone:nie ma ResponseRatings
bez Response
i ocenę User
.
19.7. Ale mogą istnieć Users
, Lokalizacje, and
Kategorie`, niezależnie.
.
20. Jeśli nie masz nic przeciwko, podam konwencje nazewnictwa itp. Powinny być oczywiste, a wartość pojawi się dopiero po rozpoczęciu kodowania SQL. Proszę zapytać, czy coś nie jest. Na początek wszystkie nazwy są w liczbie pojedynczej. Mieszana wielkość liter jest łatwiejsza do odczytania (w języku SQL należy używać wielkich liter).
20.1. Z mojego doświadczenia wynika, że table_name w przeciwieństwie do tableName to naprawdę techniczne formularze, a użytkownicy ich nie lubią; Konsekwentny przypadek mieszany jest lubiany przez wszystkich. To jedna z tych rzeczy, których nie da się zmienić, więc wybieraj ostrożnie.
.
21. Jeśli chcesz pogrupować stoły, co jest dobre, pamiętaj, że jest to problem fizyczny. Na poziomie logicznego modelu danych tabele mają normalne nazwy, niezaśmiecone problemami fizycznymi. Wyobraź sobie, że fizyczne tabele są poprzedzone czymś w rodzaju (i użyj w tym celu wielkich liter):
- REF_
w celach informacyjnych (takich jak User) i tabele przeglądowe
- BUL_
dla systemu biuletynów
.
Nie mogę nazwać tabel wielkimi literami? Nie wiem dlaczego. Nie wiem, dlaczego nie mogę mieć nazw tabel pisanych wielkimi literami. Czy ma to związek z używaniem tabel bazy danych MyIsam?
.
22. rank
(wszystkie) można wyprowadzić bezpośrednio z bazy danych (pamiętaj, nie przejmuj się kodem podczas modelowania danych). Jeśli go przechowujesz, jest to błąd normalizacji; zduplikowana kolumna; które należy aktualizować; które mogą się nie zsynchronizować z wartością pochodną; która nazywa się anomalią aktualizacji. Piąta forma normalna eliminuje anomalie aktualizacji. To jest mój minimalny poziom Normalizacji, więc właśnie to ode mnie otrzymasz.
22.1. W ogóle nie ingeruję w porządek sortowania ani w kwestię popularności; w rzeczywistości, sądząc po tym, nie zamknąłeś tej funkcjonalności. Pobieram tylko zbędne dane, kolumna rangi , jako część procesu normalizacji.
22.2. Oto ▶Szybki samouczek◀
na operatorze RANK() (jak jest powszechnie znany). To nie jest ANSI SQL; jest to rozszerzenie Oracle i MS. Nie jest to jednak wymagane, jeśli rozumiesz podzapytania, dlatego Sybase ich nie ma. Wątpię, czy MySQL to ma, więc musisz się nad tym zastanowić. Zrozumienie podzapytań skalarnych jest warunkiem wstępnym. Składnia Sybase, więc walnij średnikami itp. Możesz zadawać konkretne pytania.
.
Nigdy nie spotkałem się z takim podejściem do pisania Rank =(SELECT.... Czy to to samo co (SELECT ...) co Ranga?
.
22.3. Konieczność zrozumienia dlaczego nie stanowi żadnego problemu. Tylko dzieci ślepo przestrzegają prostych zasad, a Ty na pewno nie jesteś jednym z nich.
.
23. Potwierdzone:users.total_bulletins
jest zbędny; można go wyprowadzić. Usunięto.
.
24. Wszystkie twoje PK to identyfikatory. Nie zmęczyłeś się jeszcze gubieniem się w kodzie? Zapomnij o wklejaniu Id
iot PK na temat wszystkiego, co się rusza, dowiedzmy się, jak Twoi użytkownicy Zidentyfikuj ich podmioty; które Podmioty są naprawdę Niezależne, a inne, które zależą od Podmiotów Niezależnych.
24.1. Nigdy nie używaj Id
lub w dowolnej takiej formie. Jeśli jest to PK, użyj pełnego formularza.
24.2. Wywołaj location_id, location_id, gdziekolwiek to jest, łącznie z tabelą PK. Wyjątkiem jest sytuacja, gdy musisz pokazać rolę. Stanie się to jasne w modelu danych.
.
25. Nie masz deklaratywnej integralności odniesienia, nie masz zdefiniowanej Klucz obcy. To zła wiadomość z wielu różnych powodów. Po wyjaśnieniu tych pytań dodaj je. DRI oznacza, że w języku SQL zadeklarowana jest jak najwięcej, jeśli nie całość, integralności. Norma ISO/IEC/ANSI SQL pozwala na to, ale freeware koniec rynku nie zapewnia standardu i powoli nadrabia zaległości. Oznacza to, że serwer nie pozwoli na dodanie wiersza w tabeli FK, chyba że PK istnieje w tabeli nadrzędnej. MySQL dostarczył ostatnio DRI dla kluczy obcych. W przypadku FK patrz ▶ ten artykuł◀
.
25.1. W przypadku ograniczeń CHECK i REGUŁ, będziesz musiał zaimplementować je w kodzie.
moje klucze obce to:users-id(fk) =users.id(pk) Nie jestem pewien, jak je dodać poza tym, co zrobiłem, ale na pewno to zrobię, gdy będę wiedział, jak to zrobić.
Dwadzieścia pięć. Zanotowano komentarze. Nie jestem specjalistą MySQL. Tak, to są problemy, które musisz sam rozwiązać. Ogólnie rzecz biorąc, z mojego przeglądu MySQL jest beznogi; do wszystkiego, co związane z SQL, potrzebujesz InnoDB.
.
27. Biorąc pod uwagę:Przemyślałem ponownie wymagania dotyczące sortowania biuletynu. Użytkownicy mogliby sortować chronologicznie – łatwo, ma to sens. Użytkownicy mogli sortować biuletyny według daty ostatniej odpowiedzi na biuletyn. Wtedy możemy zapomnieć o randze i powinno być naprawdę łatwo posortować biuletyny chronologicznie według czasu ich ostatniej odpowiedzi? Jakie są Twoje przemyślenia.
Otwarte problemy
(brak)
Model danych
Ok, zakładając, że nie masz problemów z ERD i wdrażając wszystkie zamknięte problemy, wymodelowałem dane i przygotowałem Piąty model danych 9 grudnia 10 Do Twojego wglądu. Zdecydowanie potrzebuję dużo więcej informacje zwrotne, pytania itp. na ten temat. Mam trudności z zaakceptowaniem, że tak się stało. Prawdopodobnie najlepiej zacząć pisać prawdziwy kod dla obszarów problemowych.
Linki
▶Link do IDEF1X Notation◀ Naprawdę musisz to przeczytać i zrozumieć, zanim przeczytasz model danych.
▶Link do danych piątego biuletynu Model◀ Diagram relacji między jednostkami znajduje się na pierwszej stronie, a następnie Model danych .
-
Klucze są prawie proste IDEF1X (z wyjątkiem UserId, który podałem jako kontrapunkt); co oznacza torebkę Klucze Relacyjne. Nieulepszony i niezoptymalizowany pod kątem fizycznym. Zanim zaczniesz się na nie czepiać, najpierw je zauważ, zarejestruj i oceń. Oczywiście możemy dodać
Id
klucze iot, ale zanim to zrobimy, upewnijmy się, że rozumiemy, co stracimy. -
Zwróć uwagę na Identyfikatory (linie ciągłe) zgodnie z dokumentem Notation. Kręgosłup, kręgi systemu to
Location ... Bulletin ... Response
. -
Zauważ, że klucze faktycznie implementują wiele reguł biznesowych.
-
Zwróć uwagę na naturalną hierarchię, którą przedstawiłem. Zobacz, czy ma to dla Ciebie jakiekolwiek znaczenie.
-
Frazy czasownikowe są naprawdę ważne; sprawdź, czy coś znaczą.
Komentarze dotyczące pierwszego modelu danych i odpowiedzi
Mam jedno pytanie, czy klucz podstawowy lokalizacji zostanie użyty do utworzenia podrzędnego klucza podstawowego? (są one połączone linią ciągłą) Naprawdę nie rozumiem tego pojęcia
- Co to jest dobry identyfikator biuletynu? , czego twoi użytkownicy naturalnie używają do identyfikacji biuletynu...
- „czy widziałeś wczoraj biuletyn z Wirginii FO?”,
- „Sally z Waszyngtonu pisze dobre biuletyny” itp.
lub dlaczego ta relacja nie istnieje między użytkownikiem a biuletynem?
-
Zgodnie z intencją opisaną powyżej, ponieważ teraz pokazałem ocenę jako tabelę i jakie będzie renderowanie, raz ją usunę
-
Myślę, że Pozwolenie powinno być Jednostką.
-
Bulletin
PK to teraz(StateCode, Town, UserId, SequenceNo)
. Aby było jasne,SequenceNo
znajduje się wStateCode, Town, UserId
:będzie 5 w piątym biuletynie Sally w sprawie MO/Billngs FO. -
Pamiętaj, że ustawienia użytkownika
BulletinsPerPage
itd. są 1::1 zUser
, więc znajdują się wUser
; tabela podrzędna byłaby nieprawidłowa. -
Poprawiono błędy typograficzne.
Komentarze dotyczące drugiego modelu danych i odpowiedzi
- PK do obu
Bulletin
iResponse
zostały zmienione w celu odzwierciedlenia (7).BulletinNo
iResponseNo
zostały zastąpione przezBulletinDate
iResponseDate
(który kiedyś byłCreatedDate
), aby umożliwić wiele odpowiedzi naUser
naBulletin
.
Komentarze dotyczące trzeciego modelu danych i odpowiedzi
Zaufaj, że miałeś dobrą przerwę.
-
Co najmniej 30 lat temu (o czym jestem świadomy) giganci w branży mieli tę debatę. Imiona są zawsze w liczbie pojedynczej. Tabele są rzeczownikami. VerbFrazy to czasowniki. Nie ogranicza się to do konwencji nazewnictwa baz danych, dotyczy to dokumentów, tez, dysertacji itp. Możesz mieć 5 wniosków na końcu dokumentu, ale tytuł sekcji lub rozdziału, zarówno w ToC, jak i na górze strony to „Wniosek”.
Po walce z nimi przez cały Uni, gdy tylko zacząłem swoją pierwszą płatną pracę programistyczną i zobaczyłem znaczenie reguł w prawdziwym świecie, w przeciwieństwie do teoretycznych argumentów, które mieliśmy na studiach, zrezygnowałem z tego jako marnotrawstwo czasu. Cały ten czas i energię, które zmarnowałem, zostały uwolnione do produktywnej pracy. Od tego czasu nie kwestionuję gigantów; Po prostu akceptuję. Że ich umysły są większe niż moje. To jest jak akceptowanie norm lub postępowanie zgodne z prawem lub Bogiem. Nie mam naprawdę dobrych powodów, by robić cokolwiek nielegalnego.
Zresztą łatwość posługiwania się językiem (dyskusja, SQL, dokumentacja), którą wspierają takie reguły, nie może być odpowiednio wyjaśniona; gdy będziesz pisać coraz więcej kodu SQL, stanie się to jasne.
Zawsze możesz używać tego, co chcesz. Dostarczam tylko w liczbie pojedynczej.
-
Nie mam nic przeciwko.
Należy jednak pamiętać, że te dwa elementy w zidentyfikowanej kolejności (ala non-PK Unique Index lub Alternate Key) są powszechnie wymagane do ustalenia unikalności osoby. Usunięcie ich spowoduje dwie rzeczy. Po pierwsze, nie będziesz już w stanie zidentyfikować niepowtarzalności wśród
Users
(a zatem możesz mieć zduplikowane wiersze). Po drugie, AK staje się nieunikatowe, wpis inwersji. -
Chodzi o to (w przeciwieństwie do jednego z postów), dowolna kolumna, która jest 1::1 z
User
PK, powinien znajdować się wUser
. Wszystkie ustawienia preferencji. Ponieważ wyczyściliśmyInterestedLocations
iInterestedCategories
, znam tylkoBulletinsPerPage
pozostały; ale jestem pewien, że są inni.IsPreference2
jest np. wartości logicznej;NumPreference3
jest np. liczby całkowitej. Itd. Możesz mi powiedzieć, jakie są prawdziwe Preferencje.(Spróbujmy tego w liczbie mnogiej:... dowolna kolumna, która jest 1::1 z
Users
PK, powinien znajdować się wUsers
. Po prostu nie robi tego za mnie, rozłączam się z łamaną angielszczyzną i jestem trochę cenny w moim języku ojczystym.)Zaktualizowano model danych.
-
Doskonały. Daj mi znać, kiedy ci to odpowiada, a dam ci model fizyczny.
A co z czasownikami?
Komentarze do 06 grudnia 10, 20:38 EST (małe aktualizacje)
.
28. Tam, gdzie występuje tylko jedno wystąpienie PK jako FK, oczywiście nazwa kolumny FK jest taka sama jak nazwa kolumny PK. Jednakże, gdy w FK jest więcej niż jedno occ (spójrz na ResponseRating
), istnieją trzy UserIds
), musimy je rozróżnić. W terminologii IDEF1X nazywa się to rolami. Rola User
kto wydał Bulletin
jest Issuer
, i tak dalej. Oczywiście lepiej jest używać tej nazwy i utrzymywać ją spójną w całej hierarchii (nie UserId
w Bulletin
a potem gdy dojdziemy do Response
, gdzie są dwa i wymagane jest rozróżnienie, zmień go na IssuerId
. Pomyślałem, że możesz mieć z tym problem; we wczesnych stadiach użycie to Issuer.UserId
aby było absolutnie jasne, że jest to UserId
jako FK, a rolą jest Issuer
; kiedy dochodzimy do modelu fizycznego, zostaje on uproszczony do IssuerId
.
Podobnie mamy wiele kolumn DateTime (w skrócie Date, jeśli chcesz; w przeciwnym razie Dtm), które należy rozróżnić.
.
29. Czy dokument IDEF1X Notation nie miał sensu?
- PK dla każdego stołu znajduje się powyżej linii, w określonej kolejności.
- Pamiętaj, że i tak nosimy PK tabel nadrzędnych, a jeśli ma to znaczenie, użyj tych FK do utworzenia potomnej PK.
-
Dla
Bulletin
:- Lokalizacja FK
(StateCode, Town)
dla którego jest wydawany UserId
Emitenta- i Data i godzina wydania, aby była unikalna.
- dlatego (StateCode, Town, IssuerId, BulletinDate)`
- Lokalizacja FK
-
Aby usunąć wszystkie
ResponseRatings
dla tegoBulletin
, użyjWHERE =
na tych czterechBulletin
kolumny.
.
30. Ponieważ (State, Town)
to PK Location
, niosąc wszędzie. I stanowi część Bulletin
PK, więc wszystkie tabele zależne zawierają te kolumny, ponieważ zawierają Bulletin
PK.
Wcześniej zidentyfikowaliśmy, że (State, Town)
jest PK, zostawię to bez zmian Patrz (38) dla zmian.
.
33. Warto omówić. Tak, jeśli masz zamiar wyświetlić go podczas (np.) wyświetlania Response
, a użytkownicy rozumieją UserName
. Nie, jeśli ma 30 bajtów i istnieje również unikalny 4-bajtowy UserId
. Chodzi o to, aby świadomie dokonywać tych wyborów, mając świadomość tego, z czego rezygnujesz, kiedy w końcu zdecydujesz, że jakiś 6-kolumnowy 30-bajtowy klucz jest zbyt nieporęczny, aby przenieść go na dzieci.
- Na początku stwierdziłem, że użyłbym
UserId
jako typowyId
Pk, ponieważ jest przenoszony/migrowany do kilku tabel podrzędnych. - Sposób tworzenia możemy zostawić na później. Ale to czysty surogat PK.
.
34. Nie ma problemu. Category
już to ma. Zmienię Order
do ListOrder
.
.
35. Pewny. Opierając się na tym, co przeczytałem i usłyszałem, jestem z tego całkiem zadowolony. Ale chciałbym, aby więcej tam i z powrotem nabrało pewności, zanim zaczniesz pisać kod. Ewentualnie potraktuj to jako doświadczenie edukacyjne i zaakceptuj, że model i kod mogą się później zmienić. Czy chcesz, żebym teraz wyprodukował Fizyczną? Jeśli dacie mi jakieś poprawki, opublikuję kolejną wersję. Oczekuję preferencji w User
. Ponadto szybko przejrzyj funkcje i sprawdź, czy masz wszystkie potrzebne kolumny.
Przyjrzyj się niektórym innym odpowiedziom w celu uczenia się i zainteresowania.
.
36. Łączy. Po prostu dołączasz do czterech trzy kolumny w przeciwieństwie do jednej. SQL jest kłopotliwy z łączeniami, a nowa składnia, która miała to ułatwić, jest w rzeczywistości bardziej kłopotliwa. Moi programiści nigdy nie piszą złączeń:oszczędzamy czas i literówki. Mam proc, który biorąc pod uwagę dwie lub więcej tabel, wygeneruje kod ze wszystkimi kolumnami i złączeniami. Nie znam wystarczająco MySQL, aby to dla Ciebie przekonwertować.
Zaktualizowano model danych.
.
Komentarze do 08.10.10, 20:49, Czwarty model danych i odpowiedzi
.
Sprawdź poprzednią sekcję bezpośrednio powyżej, są małe aktualizacje.
IDEF1X:Twoja prędkość jest w porządku.
Zwróć uwagę na dziecko zawsze „dziedziczy” PK nadrzędne, jako FK (linia ciągła lub przerywana), w przeciwnym razie nie ma między nimi relacji. Używając tych kolumn, które i tak istnieją w dziecku, aby utworzyć dziecko PK, nosimy znaczenie (i to jest różnica między solidnym a zepsutym). I tym samym nie musimy szukać samodzielnego Identyfikatora dla dziecka. Siła relacyjna w tej metodzie stanie się jasna później, podczas kodowania.
Sekcja, którą się zajmujemy, dotyczy identyfikatorów :naturalne vs nienaturalne; znaczące vs bezsensowne. Później zobaczysz, jak możemy wykorzystać relacyjną zdolność silnika, gdy PK potomny jest tworzony z PK rodzica. (Czy twoje nazwisko nie jest takie samo jak twojego ojca?)
Ważne jest również zrozumienie relacyjnych baz danych i ich możliwości. Tracimy to, gdy podchodzimy do bazy danych (np.) z perspektywy OO i traktujemy ją jako lokalizację, dzięki której nasze klasy są „trwałe”. Dlatego postaramy się nauczyć i używać pojęć relacyjnych. Robi się trudno, gdy jedziesz do Francji i oczekujesz, że mówią po amerykańsku i używają tej samej waluty; naucz się mówić 10 słów po francusku, a witają cię z otwartymi ramionami, a będziesz miał zupełnie inne doświadczenia z mieszkańcami.
W każdym razie kontynuuj wdrożenie modelu. Po prostu zdaj sobie sprawę, że prawdopodobnie w pewnym momencie dokonamy zmiany. Zapisz wszystkie swoje DDL. Zapisz wszystkie dane testowe jako instrukcje wstawiania lub jako kopię zapasową tabeli lub eksport formatu znaków (nie mam pojęcia, co MySQL może/nie może zrobić w tym obszarze).
37.1. Obsługiwana relacja n::n z Office
&Category
. Zobaczysz to dopiero, gdy dojdziemy do modelu fizycznego.
37.2. Gotowe.
37.3 Gotowe.
.
38. Doskonały. Również krótsze. Pamiętaj, że nigdy nie będą mogli mieć dwóch Offices
w tym samym kodzie pocztowym. NUMERIC(5,0) jest dobry, ale myślałem, że USA zmierzają w kierunku 7 cyfr. Nie ma znaczenia, możesz to rozgryźć; to doskonały pakiet PK dla Office
. Teraz ta kolumna, która była częścią Address
, prawdopodobnie ZipCode
, został wyniesiony do wyższego celu, bez powielania; ponieważ przechowujemy go w 5 tabelach podrzędnych i chcemy, aby nazwa PK była jasna, zgodnie z wcześniej wyjaśnionymi konwencjami, nazwiemy ją OfficeCode
; OfficeZipCode
może być głupie.
Potrzebujemy unikalnego indeksu dla Name
aby upewnić się, że nie dodadzą dwóch Offices
o tej samej nazwie. Uwaga, w celu wyjaśnienia, jest to w rzeczywistości klucz logiczny Office
, zastępując (StateCode, Town)
, i tak pozostaje.
Nadal uważam, że możesz potrzebować StateCode
i Town
jako szybkie odniesienie (inne niż siedzenie gdzieś w Address
)
Zaktualizowano model danych, piąty jest już dostępny do przeglądu. Nie określiłeś swoich preferencji dla ...Date
vs ...Dtm
. Idę z tym drugim, ponieważ jest bardziej konkretny, identyfikując również składnik czasu. Łatwa zmiana.
Ta odpowiedź osiągnęła maksymalną długość. Ciąg dalszy w „Części II”