Powiedzmy, że mam tabelę o nazwie User_FriendList
, która ma następujące cechy:
CREATE TABLE User_FriendList (
ID ...,
User_ID...,
FriendList_IDs...,
CONSTRAINT User_Friendlist_PK PRIMARY KEY (ID)
);
Przypuśćmy, że wspomniana tabela zawiera następujące dane:
+ ---- + --------- + --------------------------- + | ID | ID_użytkownika | Friendlist_IDs | + ---- + --------- + --------------------------- + | 1 | 102 | 2: 15: 66: 35: 26: 17: | + ---- + --------- + --------------------------- + | 2 | 114 | 1: 12: 63: 33: 24: 16: 102 | + ---- + --------- + --------------------------- + | 3 | 117 | 6: 24: 52: 61: 23: 90: 97: 118 | + ---- + --------- + --------------------------- +
Uwaga: „:” (dwukropek) jest ogranicznikiem podczas eksplozji w PHP na an array
.
pytania
Więc:
Jest to wygodny sposób do „sklepu”
IDs
o tematyceFriendList
?Czy zamiast tego powinienem mieć pojedyncze wiersze z tylko jedną pojedynczą
FriendId
wartością w każdym z nich, a kiedy muszę pobrać wszystkie wiersze z danej listy , po prostu wykonaj zapytanie podobneSELECT * FROM UserFriendList WHERE UserId = 1
?
Odpowiedzi:
Zarządzanie pojedynczą informacją
Zakładając, że w Twojej domenie biznesowej
następnie każdy konkretny punkt odniesienia zebrany w
Friendlist_IDs
kolumnie wielowartościowej reprezentuje oddzielną informację, która ma bardzo dokładne znaczenie. Dlatego wspomniana kolumnaKrótka odpowiedź
W związku z tym powinieneś zachować każdą z
Friendlist_IDs
wartości w (a) kolumnie, która akceptuje tylko jedną wyłączną wartość na wiersz w (b) tabeli, która reprezentuje typ powiązania na poziomie koncepcyjnym, który może mieć miejsce między użytkownikami , tj. Przyjaźń - jako Zilustruję to następującymi sekcjami—.W ten sposób będziesz w stanie obsłużyć (i) wspomnianą tabelę jako relację matematyczną oraz (ii) wspomnianą kolumnę jako atrybut relacji matematycznej - podobnie jak MySQL i oczywiście jego dialekt SQL - oczywiście.
Dlaczego?
Ponieważ relacyjny model danych , stworzony przez dr E. F. Codda , wymaga posiadania tabel składających się z kolumn zawierających dokładnie jedną wartość odpowiedniej domeny lub typu na wiersz; dlatego zadeklarowanie tabeli z kolumną, która może zawierać więcej niż jedną wartość domeny lub typu, o którym mowa (1), nie reprezentuje relacji matematycznej i (2) nie pozwoliłoby na uzyskanie korzyści zaproponowanych w wyżej wymienionych ramach teoretycznych.
Modelowanie przyjaźni między użytkownikami : Najpierw należy zdefiniować reguły środowiska biznesowego
Zdecydowanie zalecam rozpoczęcie tworzenia bazy danych określającej - przed czymkolwiek innym - odpowiedni schemat pojęciowy na podstawie definicji odpowiednich reguł biznesowych, które między innymi muszą opisywać rodzaje wzajemnych powiązań między różnymi aspektami zainteresowania, tj. , odpowiednie typy jednostek i ich właściwości ; na przykład:
Schemat IDEF1X dla ekspozytora
W ten sposób udało mi się uzyskać diagram IDEF1X 1 pokazany na rysunku 1 , który integruje większość wcześniej sformułowanych reguł:
Jak pokazano, Wnioskodawca i Adresat są oznaczeniami, które wyrażają Role realizowane przez konkretnych Użytkowników biorących udział w danej Przyjaźni .
W związku z tym typ encji Przyjaźń przedstawia typ asocjacji o stosunku liczności wiele do wielu (M: N), który może obejmować różne przypadki tego samego typu encji, tj . Użytkownika . Jako taki, jest to przykład klasycznej konstrukcji znanej jako „Zestawienie materiałów” lub „Wybuch części”.
1 Integration Definition for Information Modeling ( IDEF1X ) to wysoce godna polecenia technika, która została ustanowiona jako standard w grudniu 1993 r. Przez amerykański Narodowy Instytut Norm i Technologii (NIST). Jest solidnie oparty na (a) wczesnym materiale teoretycznym autorstwa jedynego twórcy modelu relacyjnego, tj. Dr EF Codda ; na (b)widok danych relacji jednostka , opracowany przez dr PP Chen ; a także w (c) Logical Database Design Technique, stworzonej przez Roberta G. Browna.
Ilustracyjny logiczny projekt SQL-DDL
Następnie, zgodnie ze schematem IDEF1X przedstawionym powyżej, zadeklarowanie układu DDL, takiego jak poniższy, jest znacznie bardziej „naturalne”:
W ten sposób:
Zalety kolumny o pojedynczej wartości
Jak wykazano, możesz np .:
Skorzystaj z integralności referencyjnej wymuszonej przez system zarządzania bazą danych (DBMS dla zwięzłości) dla
Friendship.AddresseeId
kolumny, ponieważ ograniczenie jej jako KLUCZA OBCEGO (FK dla zwięzłości), który odnosi się doUserProfile.UserId
kolumny, gwarantuje, że każda wartość wskazuje na istniejący wiersz.Utwórz złożony KLUCZ PODSTAWOWY (PK) złożony z kombinacji kolumn
(Friendship.RequesterId, Friendship.AddresseeId)
, pomagając elegancko odróżnić wszystkie WSTAWIONE rzędy i, naturalnie, chronić ich wyjątkowość .Oczywiście oznacza to, że dołączenie dodatkowej kolumny dla przypisanych przez system wartości zastępczych (np. Skonfigurowanej z właściwością IDENTITY w Microsoft SQL Server lub z atrybutem AUTO_INCREMENT w MySQL) i INDEKS pomocniczy jest całkowicie zbędny .
Ogranicz zachowane wartości
Friendship.AddresseeId
do dokładnego typu danych c (który powinien pasować np. Do tego ustalonego dlaUserProfile.UserId
, w tym przypadku INT), pozwalając DBMS zająć się odpowiednią automatyczną weryfikacją.Ten czynnik może również pomóc (a) wykorzystać odpowiednie wbudowane funkcje typu i (b) zoptymalizować wykorzystanie miejsca na dysku .
Zoptymalizuj pobieranie danych na poziomie fizycznym, konfigurując małe i szybkie INDEKSY podrzędne dla
Friendship.AddresseeId
kolumny, ponieważ te fizyczne elementy mogą znacznie pomóc w przyspieszeniu zapytań dotyczących tej kolumny.Oczywiście, możesz np. Ustawić INDEKS jednokolumnowy dla
Friendship.AddresseeId
samego, wielokolumnowy, który obejmujeFriendship.RequesterId
iFriendship.AddresseeId
, lub jedno i drugie.Unikaj niepotrzebnej złożoności wprowadzonej przez „wyszukiwanie” odrębnych wartości, które są gromadzone razem w tej samej kolumnie (najprawdopodobniej powielone, źle wpisane itp.), Co może spowolnić działanie systemu, ponieważ muszą skorzystać z czasochłonnych zasobów i metod nierelacyjnych, aby wykonać to zadanie.
Istnieje zatem wiele powodów, które wymagają dokładnej analizy odpowiedniego środowiska biznesowego w celu dokładnego zaznaczenia typu d każdej kolumny tabeli.
Jak wyjaśniono, rola projektanta bazy danych jest najważniejsza, aby jak najlepiej wykorzystać (1) korzyści na poziomie logicznym oferowane przez model relacyjny oraz (2) mechanizmy fizyczne zapewniane przez wybrany DBMS.
, b , c , d Widocznie podczas pracy z platformami SQL (np Firebird i PostgreSQL ), że tworzenie wsparcie domeny (charakterystyczny relacyjny funkcję), można zadeklarować kolumn tylko przyjąć wartości, które należą do ich prawnych (słusznie ograniczone, a czasem udostępnione) DOMAIN.
Jeden lub więcej aplikacji współdzielących rozważaną bazę danych
Gdy musisz zastosować
arrays
kod aplikacji, które uzyskują dostęp do bazy danych, musisz po prostu pobrać odpowiednie zestawy danych w całości, a następnie „powiązać” je z odpowiednią strukturą kodu lub wykonać powiązane procesy, które powinny mieć miejsce.Dalsze zalety kolumn o jednej wartości: Rozszerzenia struktury bazy danych są znacznie łatwiejsze
Kolejną zaletą trzymania
AddresseeId
punktu danych w zarezerwowanej i odpowiednio wpisanej kolumnie jest to, że znacznie ułatwia rozszerzenie struktury bazy danych, co zilustruję poniżej.Postęp scenariusza: włączenie koncepcji statusu przyjaźni
Ponieważ przyjaźnie mogą ewoluować w czasie, być może będziesz musiał śledzić takie zjawisko, więc będziesz musiał (i) rozwinąć schemat koncepcyjny i (ii) zadeklarować kilka dodatkowych tabel w układzie logicznym. A zatem, ustalmy kolejne reguły biznesowe, aby nakreślić nowe włączenia:
Rozszerzony schemat IDEF1X
Sukcesywnie poprzedni schemat IDEF1X można rozszerzyć, aby uwzględnić nowe typy jednostek i typy powiązań opisane powyżej. Schemat przedstawiający poprzednie elementy związane z nowymi przedstawiono na rysunku 2 :
Uzupełnienia struktury logicznej
Następnie możemy wydłużyć układ DDL o następujące deklaracje:
W związku z tym za każdym razem, gdy status danej przyjaźni musi być aktualizowany, użytkownicy będą musieli WSTAWIĆ tylko nowy
FriendshipStatus
wiersz zawierający:odpowiednie
RequesterId
iAddresseeId
wartości - wzięte z odpowiedniego wiersza -Friendship
;nowa i znacząca
StatusCode
wartość - zaczerpnięta zMyStatus.StatusCode
-;dokładna chwila WSTAWIANIA, tj. -
SpecifiedDateTime
najlepiej przy użyciu funkcji serwera, aby można było ją pobrać i zachować w niezawodny sposób -; iSpecifierId
wartość, która wskazuje odpowiedniUserId
która weszła nowaFriendshipStatus
w systemie -ideally, przy pomocy aplikacji (s) facilities-.W tym zakresie załóżmy, że
MyStatus
tabela zawiera następujące dane - z wartościami PK, które są (a) przyjazne dla użytkownika końcowego, programisty aplikacji i DBA oraz (b) małe i szybkie pod względem bajtów na poziomie implementacji fizycznej -:Tak więc
FriendshipStatus
tabela może zawierać dane, jak pokazano poniżej:Jak widać, można powiedzieć, że
FriendshipStatus
tabela służy szeregowi czasowemu .Odpowiednie posty
Równie interesujące mogą być:
źródło