Ilekroć projektuję bazę danych, zawsze zastanawiam się, czy istnieje najlepszy sposób nazywania elementu w mojej bazie danych. Dość często zadaję sobie następujące pytania:
- Czy nazwy tabel powinny być w liczbie mnogiej?
- Czy nazwy kolumn powinny być pojedyncze?
- Czy powinienem prefiksować tabele lub kolumny?
- Czy powinienem używać nazwy w nazwach przedmiotów?
Czy istnieją jakieś zalecane wytyczne dotyczące nazewnictwa elementów w bazie danych?
Odpowiedzi:
Polecam sprawdzenie przykładowych baz danych Microsoft SQL Server: https://github.com/Microsoft/sql-server-samples/releases/tag/adventureworks
W przykładzie AdventureWorks zastosowano bardzo przejrzystą i spójną konwencję nazewnictwa, która używa nazw schematów do organizacji obiektów bazy danych.
źródło
Spóźniona odpowiedź tutaj, ale w skrócie:
Opracowanie:
(1) Co musisz zrobić. Za każdym razem jest niewiele rzeczy, które musisz zrobić w określony sposób, ale jest kilka.
(2) Co prawdopodobnie powinieneś zrobić.
(3) Co powinieneś rozważyć.
źródło
CustomerID
jest to klucz podstawowy zCustomer
tabeli, czy klucz obcy w innej tabeli. To drobny problem. Dlaczego chcesz używać takich złych nazwisk jakc
?CustomerID = Customer.ID
jest bardzo jasne, ponieważ widzisz, że łączysz klucz obcy z kluczem podstawowym; nie jest zbędny, ponieważ dwie strony to dwie różne rzeczy. Nazewnictwo pojedynczymi znakami to zła praktyka IMO.Ok, ponieważ rozważamy opinię:
Uważam, że nazwy tabel powinny być w liczbie mnogiej. Tabele są zbiorem (tabelą) encji. Każdy wiersz reprezentuje pojedynczy byt, a tabela reprezentuje kolekcję. Tak więc nazwałbym tabelę bytu Osoby Osobą (lub Osobą, cokolwiek ci się podoba).
Dla tych, którzy lubią widzieć w zapytaniach pojedyncze „nazwy jednostek”, użyłbym do tego aliasów tabel:
Trochę jak LINQ „od osoby w osobach wybierz person.Name”.
Jeśli chodzi o 2, 3 i 4, zgadzam się z @Lars.
źródło
Pracuję w zespole wsparcia bazy danych z trzema bazami danych i nasze rozważane opcje to:
Używamy pojedynczych nazw dla tabel. Tabele zwykle mają prefiks nazwy systemu (lub jego akronimu). Jest to przydatne, jeśli kompleks systemu, ponieważ możesz zmienić prefiks, aby pogrupować tabele logicznie (tj. Reg_customer, reg_booking i regadmin_limits).
W przypadku pól spodziewalibyśmy się, że nazwy pól będą zawierać prefiks / acryonm tabeli (tj. Cust_address1), a także wolimy używać standardowego zestawu sufiksów (_id dla PK, _cd dla „kodu”, _nm dla „name” ”, _nb dla„ liczba ”, _dt dla„ Data ”).
Nazwa pola klucza Foriegn powinna być taka sama jak pola klucza podstawowego.
to znaczy
Podczas opracowywania nowego projektu zalecam zapisanie wszystkich preferowanych nazw encji, prefiksów i akronimów i przekazanie tego dokumentu swoim programistom. Następnie, decydując się na utworzenie nowej tabeli, mogą odwoływać się do dokumentu, zamiast „odgadnąć”, jak powinna się nazywać tabela i pola.
źródło
Ok. To moje 0,02 $
źródło
Popieram także konwencję nazewnictwa w stylu ISO / IEC 11179, zauważając, że są one raczej wytycznymi niż nakazowymi.
Zobacz Nazwa elementu danych na Wikipedii :
„Tabele są kolekcjami jednostek i są zgodne z wytycznymi nazewnictwa kolekcji. Najlepiej jest używać nazwy zbiorczej: np. Personelu. Liczba mnoga jest również poprawna: pracownicy. Niepoprawne nazwy obejmują: pracownik, tblEmployee i EmployeeTable”.
Jak zawsze, istnieją wyjątki od reguł, np. Tabela, która zawsze ma dokładnie jeden wiersz, może być lepsza z pojedynczą nazwą, np. Tabela konfiguracji. A spójność ma ogromne znaczenie: sprawdź, czy Twój sklep ma konwencję, a jeśli tak, postępuj zgodnie z nią; jeśli ci się nie podoba, zrób uzasadnienie biznesowe, aby to zmienić, zamiast być samotnym łowcą.
źródło
Cały czas słyszę argument, że to, czy stół jest pluralizowany, zależy od osobistego gustu i nie ma najlepszej praktyki. Nie wierzę, że to prawda, szczególnie jako programista w przeciwieństwie do DBA. O ile mi wiadomo, nie ma uzasadnionych powodów, aby pluralizować nazwę tabeli inną niż „To po prostu ma sens, ponieważ jest to zbiór obiektów”, podczas gdy istnieją uzasadnione korzyści w kodzie dzięki posiadaniu pojedynczych nazw tabel. Na przykład:
Pozwala to uniknąć błędów i pomyłek spowodowanych wieloznacznością. Programiści nie są do końca znani ze swojej znajomości pisowni, a mnożenie niektórych słów jest mylące. Na przykład, czy liczba mnoga kończy się na „es”, czy tylko „s”? Czy to osoby czy ludzie? Podczas pracy nad projektem z dużymi zespołami może to stanowić problem. Na przykład instancja, w której członek zespołu używa niepoprawnej metody do tworzenia liczby mnogiej utworzonej przez siebie tabeli. Kiedy wchodzę w interakcję z tą tabelą, jest ona używana w całym kodzie, do którego nie mam dostępu lub którego naprawienie zajęłoby zbyt dużo czasu. Rezultat jest taki, że muszę pamiętać, aby za każdym razem, gdy go używam, źle przeliterować tabelę. Przydarzyło mi się coś bardzo podobnego do tego. Łatwiej jest dla każdego członka zespołu konsekwentnie i łatwo korzystać z dokładnych, popraw nazwy tabel bez błędów lub konieczności ciągłego wyszukiwania nazw tabel, tym lepiej. Wersja pojedyncza jest znacznie łatwiejsza w obsłudze w środowisku zespołowym.
Jeśli używasz pojedynczej wersji nazwy tabeli ORAZ przedrostek klucza podstawowego nazwą tabeli, masz teraz tę zaletę, że możesz łatwo określić nazwę tabeli na podstawie klucza podstawowego lub odwrotnie za pomocą samego kodu. Możesz otrzymać zmienną z nazwą tabeli, połączyć „Id” do końca, a teraz masz klucz podstawowy tabeli za pomocą kodu, bez konieczności wykonywania dodatkowego zapytania. Możesz też odciąć „Id” od końca klucza podstawowego, aby określić nazwę tabeli za pomocą kodu. Jeśli użyjesz „id” bez nazwy tabeli dla klucza podstawowego, nie możesz za pomocą kodu ustalić nazwy tabeli z klucza podstawowego. Ponadto większość osób, które pluralizują nazwy tabel i prefiksuje kolumny PK z nazwą tabeli, używa pojedynczej wersji nazwy tabeli w PK (na przykład statusy i status_id),
Jeśli uczynisz nazwy tabel pojedynczymi, możesz je dopasować do nazw klas, które reprezentują. Po raz kolejny może to uprościć kod i pozwolić ci robić naprawdę porządne rzeczy, takie jak tworzenie instancji klasy poprzez posiadanie tylko nazwy tabeli. To także sprawia, że kod jest bardziej spójny, co prowadzi do ...
Jeśli nazwa tabeli będzie pojedyncza, spowoduje to, że schemat nazewnictwa będzie spójny, zorganizowany i łatwy do utrzymania w każdej lokalizacji. Wiesz, że w każdym przypadku w kodzie, czy to w nazwie kolumny, czy jako nazwa klasy, czy jako nazwa tabeli, jest to ta sama dokładna nazwa. Pozwala to na przeprowadzanie globalnych wyszukiwań, aby zobaczyć wszędzie, gdzie wykorzystywane są dane. Kiedy tworzysz liczbę mnogą nazwy tabeli, będą przypadki, w których użyjesz pojedynczej wersji tej nazwy tabeli (klasa, w którą się zamienia, w kluczu podstawowym). Po prostu sensowne jest, aby nie mieć niektórych przypadków, w których dane są nazywane liczbą mnogą, a niektóre są pojedynczymi.
Podsumowując, jeśli pluralizujesz nazwy swoich tabel, tracisz wiele korzyści, czyniąc kod inteligentniejszym i łatwiejszym w obsłudze. Mogą istnieć nawet przypadki, w których trzeba mieć tabele / tablice odnośników, aby przekonwertować nazwy tabel na obiekty lub lokalne nazwy kodowe, których można było uniknąć. Nazwy pojedynczych tabel, choć początkowo mogą wydawać się trochę dziwne, oferują znaczną przewagę nad mnogimi nazwami i uważam, że są najlepszą praktyką.
źródło
nasze preferencje:
Czy nazwy tabel powinny być w liczbie mnogiej?
Nigdy. Argumenty przemawiające za tym, że jest to kolekcja, mają sens, ale nigdy nie wiadomo, co zawiera tabela (0,1 lub wiele pozycji). Liczba mnoga sprawia, że nazewnictwo jest niepotrzebnie skomplikowane. 1 dom, 2 domy, mysz kontra mysz, osoba kontra ludzie, a my nawet nie spojrzeliśmy na żadne inne języki.
Update person set property = 'value'
działa na każdą osobę w tabeli.Select * from person where person.name = 'Greg'
zwraca kolekcję / zestaw wierszy osoby wierszy.Czy nazwy kolumn powinny być pojedyncze?
Zwykle tak, z wyjątkiem przypadków łamania zasad normalizacji.
Czy powinienem prefiksować tabele lub kolumny?
Głównie preferencje platformy. Wolimy poprzedzać kolumny nazwą tabeli. Nie prefiksujemy tabel, ale wykonujemy widoki prefiksów (v_) i procedury przechowywane_procedury (sp_ lub f_ (funkcja)). Pomaga to osobom, które chcą spróbować zaktualizować v_person.age, który jest polem obliczonym w widoku (którego i tak nie można zaktualizować).
Jest to również świetny sposób na uniknięcie kolizji słów kluczowych (delivery.from zepsuje, ale delivery_from nie).
To sprawia, że kod jest bardziej szczegółowy, ale często pomaga w czytelności.
bob = new person()
bob.person_name = 'Bob'
bob.person_dob = '1958-12-21'
... jest bardzo czytelny i wyraźny. Może to jednak wymknąć się spod kontroli:
customer.customer_customer_type_id
wskazuje relację między klientem a tabelą typu klient, wskazuje klucz podstawowy w tabeli typu klient (identyfikator_typu klienta), a jeśli kiedykolwiek zobaczysz „identyfikator_typu klienta” podczas debugowania zapytania, od razu wiesz, skąd pochodzi (tabela klientów).
lub w przypadku relacji MM między typem klienta a kategorią klienta (tylko niektóre typy są dostępne dla niektórych kategorii)
customer_category_customer_type_id
... jest trochę (!) długa strona.
Czy powinienem używać nazwy w nazwach przedmiotów? Tak - małe litery :), z podkreśleniami. Są to bardzo czytelne i wieloplatformowe. W połączeniu z 3 powyżej ma to również sens.
Większość z nich to jednak preferencje. - O ile jesteś konsekwentny, powinno być przewidywalne dla każdego, kto musi to przeczytać.
źródło
SELECT * FROM people AS person WHERE person.name = 'Greg'
brzmi dla mnie najbardziej naturalnie.<table name><id>
, na przykładPersonID
czyPerson_ID
itd Dlatego większy sens, że nie imię i nazwisko Twój tabel w liczbie mnogiej, jak każdy rekord jest odrębną osobą nie ludzie.Spójrz na ISO 11179-5: Zasady nazewnictwa i identyfikacji Możesz go uzyskać tutaj: http://metadata-standards.org/11179/#11179-5
Pisałem o tym na blogu jakiś czas temu: Konwencje nazewnictwa ISO-11179
źródło
Wiem, że jest już za późno na grę i odpowiedź na to pytanie jest już bardzo dobra, ale chcę wyrazić swoją opinię na temat # 3 dotyczącego prefiksu nazw kolumn.
Wszystkie kolumny należy nazwać prefiksem unikalnym dla tabeli, w której są zdefiniowane.
Np. Biorąc pod uwagę tabele „klient” i „adres”, przejdźmy do prefiksów odpowiednio „cust” i „addr”. „klient” zawiera „cust_id”, „cust_name” itd. „adres” zawierałby „addr_id”, „addr_cust_id” (FK wraca do klienta), „addr_street” itp.
Kiedy po raz pierwszy przedstawiono mi ten standard, byłem przeciwny temu; Nienawidziłem tego pomysłu. Nie mogłem znieść myśli o tym dodatkowym pisaniu i redundancji. Teraz mam wystarczająco dużo doświadczenia, że nigdy nie wrócę.
W wyniku tego wszystkie kolumny w schemacie bazy danych są unikalne. Jest to jedna główna korzyść, która przewyższa wszystkie argumenty przeciwko niemu (moim zdaniem oczywiście):
Możesz przeszukać całą bazę kodu i niezawodnie znaleźć każdy wiersz kodu, który dotyka określonej kolumny.
Korzyści z # 1 są niewiarygodnie ogromne. Mogę wycofać kolumnę i dokładnie wiedzieć, jakie pliki należy zaktualizować, zanim kolumna będzie mogła zostać bezpiecznie usunięta ze schematu. Mogę zmienić znaczenie kolumny i dokładnie wiedzieć, jaki kod należy refaktoryzować. Mogę też po prostu stwierdzić, czy dane z kolumny są nawet używane w określonej części systemu. Nie mogę policzyć, ile razy zamienił potencjalnie ogromny projekt w prosty, ani ile godzin zaoszczędziliśmy na pracach programistycznych.
Inną, stosunkowo niewielką korzyścią jest to, że musisz używać aliasów tabeli tylko podczas samodzielnego łączenia:
źródło
reliably find every line of code that touches a particular column
... Czy nie o to chodzi?Moje opinie na ich temat są następujące:
1) Nie, nazwy tabel powinny być pojedyncze.
Choć wydaje się, że prosty wybór (
select * from Orders
) ma sens, ma mniej sensu dla ekwiwalentu OO (Orders x = new Orders
).Tabela w DB jest tak naprawdę zbiorem tego bytu, ma to większy sens, gdy używasz logiki set:
Ta ostatnia linia, rzeczywista logika łączenia, wydaje się myląca z mnogimi nazwami tabel.
Nie jestem pewien, czy zawsze użyję aliasu (jak sugeruje Matt), aby to wyjaśnić.
2) Powinny być pojedyncze, ponieważ posiadają tylko 1 własność
3) Nigdy, jeśli nazwa kolumny jest niejednoznaczna (jak wyżej, gdzie oba mają kolumnę o nazwie [Klucz]), nazwa tabeli (lub jej alias) może je wystarczająco rozróżnić. Chcesz, aby zapytania były szybkie i proste - prefiksy dodają niepotrzebnej złożoności.
4) Cokolwiek chcesz, sugeruję CapitalCase
Nie sądzę, aby istniał jeden zestaw bezwzględnych wytycznych dotyczących któregokolwiek z nich.
Tak długo, jak cokolwiek wybierzesz, jest spójne w całej aplikacji lub DB, nie sądzę, że to naprawdę ma znaczenie.
źródło
CapitalCase
?pascal case
Product.ProductName
,Product.ProductID
,Product.ProductPrice
etc typowaniaProduct.P
daje wszystkie prefiksem pól.W mojej opinii:
Jednak, jak wspomniano, każda konwencja jest lepsza niż żadna konwencja. Bez względu na to, jak to zrobisz, udokumentuj to, aby przyszłe modyfikacje były zgodne z tymi samymi konwencjami.
źródło
Myślę, że najlepsza odpowiedź na każde z tych pytań zostanie udzielona przez ciebie i twój zespół. O wiele ważniejsze jest, aby mieć konwencję nazewnictwa niż jej dokładna konwencja.
Ponieważ nie ma właściwej odpowiedzi na to pytanie, powinieneś poświęcić trochę czasu (ale nie za dużo) i wybrać własne konwencje oraz - oto ważna część - trzymać się tego.
Oczywiście dobrze jest poszukać informacji na temat standardów w tym zakresie, o co pytasz, ale nie martw się ani nie martw o liczbę różnych odpowiedzi, które możesz uzyskać: wybierz tę, która wydaje Ci się lepsza.
Na wszelki wypadek oto moje odpowiedzi:
źródło
źródło
SELECT id,name FROM contacts WHERE email_address LIKE '%gmail%'
tabele w liczbie mnogiej, kolumny w liczbie pojedynczej. Znowu zawsze jest to kwestia osobistej opinii.Konwencje nazewnictwa pozwalają zespołowi programistycznemu zaprojektować wykrywalność i łatwość konserwacji w centrum projektu.
Dobra konwencja nazewnictwa wymaga czasu, aby ewoluować, ale po jej wprowadzeniu pozwala zespołowi posuwać się naprzód za pomocą wspólnego języka. Dobra konwencja nazewnictwa rośnie wraz z projektem. Dobra konwencja nazewnictwa łatwo radzi sobie ze zmianami podczas najdłuższej i najważniejszej fazy cyklu życia oprogramowania - zarządzania usługami w produkcji.
Oto moje odpowiedzi:
Nazewnictwo jest trudne, ale w każdej organizacji jest ktoś, kto potrafi nazwać różne rzeczy, aw każdym zespole oprogramowania powinien być ktoś, kto bierze odpowiedzialność za standardy nazewnictwa i zapewnia, że problemy z nazewnictwem, takie jak sec_id , sec_value i security_id, zostaną rozwiązane wcześniej, zanim zostaną upieczone w projekcie .
Jakie są więc podstawowe zasady dobrej konwencji nazewnictwa i standardów:
źródło
Oto link, który oferuje kilka opcji. Szukałem prostej specyfikacji, którą mogłem zastosować, zamiast polegać na częściowo zdefiniowanej.
http://justinsomnia.org/writings/naming_conventions.html
źródło
źródło
Lastname
powinno byćLastName
Nazwy tabel powinny zawsze być pojedyncze, ponieważ reprezentują zestaw obiektów. Jak mówisz, stado wyznacza grupę owiec lub stado wyznacza grupę ptaków. Nie ma potrzeby liczby mnogiej. Kiedy nazwa tabeli składa się z dwóch nazw, a konwencja nazewnictwa jest w liczbie mnogiej, trudno jest ustalić, czy nazwa w liczbie mnogiej powinna być pierwszym słowem, czy drugim słowem, czy jednym i drugim. To logika - Object.instance, a nie objects.instance. Lub TableName.column, a nie TableNames.column (s). Microsoft SQL nie rozróżnia wielkości liter, łatwiej jest odczytywać nazwy tabel, jeśli używa się wielkich liter, aby oddzielić nazwy tabel lub kolumn, gdy składają się z dwóch lub więcej nazw.
źródło
User
To nie grupa użytkowników.Nazwa tabeli: Powinna być pojedyncza, ponieważ jest pojedynczą jednostką reprezentującą obiekt świata rzeczywistego, a nie obiekty, które są osobliwe.
Nazwa kolumny: powinna być pojedyncza tylko wtedy, gdy będzie zawierać wartość atomową i potwierdzi teorię normalizacji. Jeśli jednak istnieje n liczby tego samego typu właściwości, należy je dodać 1, 2, ..., n itd.
Tabele prefiksów / kolumny: To ogromny temat, który omówimy później.
Obudowa: Powinna to być obudowa Camel
Mój przyjaciel, Patrick Karcher , proszę, abyś nie pisał niczego, co mogłoby być obraźliwe dla kogoś, jak napisałeś: „• Ponadto, klucze obce muszą być konsekwentnie wymieniane w różnych tabelach. Pobicie kogoś, kto nie jest legalny, powinno być legalne Zrób to.". Nigdy nie popełniłem tego błędu, mój przyjaciel Patrick, ale piszę ogólnie. Co jeśli razem planują cię za to pokonać? :)
źródło
Bardzo późno na imprezę, ale nadal chciałem dodać dwa centy za prefiksy kolumn
Wydaje się, że istnieją dwa główne argumenty za użyciem standardu nazewnictwa table_column (lub tableColumn) dla kolumn, oba w oparciu o fakt, że sama nazwa kolumny będzie unikalna w całej bazie danych:
1) Nie musisz przez cały czas podawać nazw tabel i / lub aliasów kolumn w swoich zapytaniach
2) Możesz łatwo przeszukać cały kod w poszukiwaniu nazwy kolumny
Myślę, że oba argumenty są błędne. Rozwiązanie obu problemów bez użycia prefiksów jest łatwe. Oto moja propozycja:
Zawsze używaj nazwy tabeli w swoim SQL. Np. Zawsze używaj table.column zamiast column.
Oczywiście rozwiązuje 2), ponieważ teraz możesz po prostu wyszukać table.column zamiast table_column.
Ale słyszę twój krzyk, jak to rozwiązuje 1)? Chodziło właśnie o to, aby tego uniknąć. Tak, ale rozwiązanie było okropnie wadliwe. Dlaczego? Cóż, rozwiązanie przedrostka sprowadza się do:
Aby uniknąć konieczności określania table.column, gdy występuje niejednoznaczność, nazwij wszystkie kolumny table_column!
Ale oznacza to, że odtąd będziesz ZAWSZE musiał pisać nazwę kolumny za każdym razem, gdy określisz kolumnę. Ale jeśli i tak musisz to zrobić, jaka jest korzyść w stosunku do zawsze jawnego pisania table.column? Dokładnie, nie ma korzyści, jest to dokładnie taka sama liczba znaków do wpisania.
edycja: tak, wiem, że nazewnictwo kolumn prefiksem wymusza prawidłowe użycie, podczas gdy moje podejście zależy od programistów
źródło
Niezbędne konwencje nazewnictwa baz danych (i styl) (kliknij tutaj, aby uzyskać bardziej szczegółowy opis)
nazwy tabel wybierają krótkie, jednoznaczne nazwy, używając nie więcej niż jednego lub dwóch słów rozróżnij tabele z łatwością ułatwia nazywanie unikalnych nazw pól, a tabele wyszukiwania i łączenia dają tabelom nazwy pojedyncze, nigdy w liczbie mnogiej (aktualizacja: nadal zgadzam się z podanymi przyczynami dla tej konwencji, ale większość ludzi naprawdę lubi nazwy w liczbie mnogiej, więc złagodziłem swoją postawę) ... proszę skorzystać z powyższego linku
źródło
e.g. PATIENTS would have a primary key called pa_patient_id_pk
!!Nazwy tabel w liczbie pojedynczej. Powiedzmy, że modelujesz relacje między kimś a jego adresem. Na przykład, jeśli czytasz model danych, wolałbyś „każda osoba może mieszkać pod adresem 0,1 lub wieloma”. lub „każdy naród może mieszkać pod 0,1 lub wieloma adresami”. Wydaje mi się, że łatwiej jest podać liczbę adresową w postaci liczby mnogiej niż wymieniać osoby jako osoby. Plus rzeczowniki zbiorowe są dość często odmienne od pojedynczej wersji.
źródło
Nauczono mnie takich konwencji, ale powinieneś dostosować się do wszystkiego, czego używasz węża.
źródło