Czy istnieje konwencja nazewnictwa MySQL?


163

Oto jak to robię:

  1. Nazwy tabeli są małymi literami, wykorzystuje podkreślenia oddzielić słowa i są pojedyncze (np foo, foo_baritp
  2. Generalnie (nie zawsze) mam PK z automatycznym zwiększaniem. Używam w następujący sposób: tablename_id(np foo_id, foo_bar_iditp).
  3. Gdy tabela zawiera kolumnę będącą kluczem obcym, po prostu kopiuję nazwę kolumny tego klucza z dowolnej tabeli, z której pochodzi. Na przykład, powiedzmy, że tabela foo_barma FK foo_id(gdzie foo_idjest PK foo).
  4. Definiując SK w celu wymuszania integralności referencyjnej, używam: tablename_fk_columnname(np. Kontynuując przykład 3, byłoby foo_bar_foo_id). Ponieważ jest to kombinacja nazwa tabeli / nazwa kolumny, gwarantujemy, że będzie ona unikalna w bazie danych.
  5. Porządkuję kolumny w ten sposób: PKs, FKs, a pozostałe kolumny alfabetycznie

Czy istnieje lepszy, bardziej standardowy sposób, aby to zrobić?


6
Czy używanie do automatycznej inkrementacji PK po prostu „id” jest niewłaściwe? Czemu? Nazwa kolumny ma znaczenie tylko w kontekście tabeli. Więc mam jeden "id" w każdej tabeli i może mieć wiele id_ <table_name> dla FK.
— Zbyszek

3
@Zbyszek Myślę, że najprostszym powodem jest po prostu konsekwencja / prostota. Zamiast mieć id_tableB=> oh bez kolumny o innej nazwieid , spójność id_tableB=> id_tableBwygląda po prostu schludniej ... lub tak jak robi to OP: foo_id=> foo_idzamiast foo_id=>id
— Don Cheadle

Odpowiedzi:


106

Powiedziałbym przede wszystkim: bądź konsekwentny.

Wydaje mi się, że jesteś prawie na miejscu z konwencjami, które nakreśliłeś w swoim pytaniu. Jednak kilka komentarzy:

Myślę, że punkty 1 i 2 są dobre.

Punkt 3 - niestety nie zawsze jest to możliwe. Pomyśl, jak poradziłbyś sobie z pojedynczą tabelą foo_barzawierającą kolumny foo_idi another_foo_idobie odwołujące się do kolumny footabeli foo_id. Warto zastanowić się, jak sobie z tym poradzić. To jednak trochę przypadek narożny!

Punkt 4 - podobny do punktu 3. Możesz chcieć wprowadzić liczbę na końcu nazwy klucza obcego, aby zapewnić więcej niż jedną kolumnę odniesienia.

Punkt 5 - Unikałbym tego. Zapewnia niewiele i przyprawi Cię o ból głowy, jeśli zechcesz później dodać lub usunąć kolumny z tabeli.

Inne punkty to:

Konwencje nazewnictwa indeksów

Możesz zechcieć wprowadzić konwencję nazewnictwa indeksów - będzie to bardzo pomocne przy każdej pracy z metadanymi w bazie danych, którą możesz chcieć wykonać. Na przykład możesz po prostu chcieć wywołać indeks foo_bar_idx1lub foo_idx1- całkowicie zależy od Ciebie, ale warto to rozważyć.

Nazwy kolumn w liczbie pojedynczej i mnogiej

Dobrym pomysłem może być zajęcie się drażliwą kwestią liczby mnogiej i pojedynczej w nazwach kolumn, a także w nazwach tabel. Ten temat często wywołuje duże debaty w społeczności DB. Pozostałbym przy formach liczby pojedynczej zarówno dla nazw tabel, jak i kolumn. Tam. Powiedziałem to.

Najważniejsza jest oczywiście konsekwencja!


Co byłoby lepsze niż punkt 5? Dlaczego może to stać się bólem głowy?
— Rasshu

7
Aby kontynuować, uważam, że ta werry jest pomocna dla tych, którzy przyjdą tutaj później: launchbylunch.com/posts/2014/Feb/16/sql-naming-conventions/ ...
— Enissay

1
Mam problem ze znalezieniem dobrego „schematu” nazywania moich tabel, które zawierają obiekty modeli składających się z dwóch nazw (DocumentChapter, DocumentVersion, DocumentType itp.). Na przykład dla DocumentType mógłbym nazwać go documenttypelub document_type. Wolałbym to drugie, ale przez większość czasu mam wiele do wielu relacji i potrzebuję stołu, który wygląda jak document_document_type. Jakieś sugestie, jak sobie z tym poradzić?
— lexith

@ rsb2097 Re: point 5 - Po dodaniu jednej kolumny (na końcu) zamówienie może stać się nieważne. Nie należy dodawać żadnych ograniczeń, które wymagają zmiany kolejności kolumn, ponieważ jest to niepotrzebny narzut.
— Will Sheppard,

21

Spójność jest kluczem do każdego standardu nazewnictwa. Dopóki jest to logiczne i spójne, jesteś tam w 99%.

Sam standard to bardzo osobiste preferencje - więc jeśli podoba ci się twój standard, biegnij z nim.

Odpowiadając wprost na twoje pytanie - nie, MySQL nie ma preferowanej konwencji / standardu nazewnictwa, więc toczenie własnej jest w porządku (a twoja wydaje się logiczna).



4

Na szczęście programiści PHP nie są „fanatykami wielbłądów”, jak niektóre społeczności programistów, które znam.

Twoje konwencje brzmią dobrze.

O ile są a) proste i b) spójne - nie widzę żadnych problemów :)

PS: Osobiście uważam, że 5) to przesada ...


2
Wielbłądy, dalekie od bycia bigotami, są w rzeczywistości źle widziane przez wielu członków społeczności DB, ponieważ niektóre RDBMS są niewrażliwe na wielkość liter do tego stopnia, że ​​usuwają skrzynki (lub zmieniają wszystko na wielkie litery), więc rzeczy stają się naprawdę brzydkie, naprawdę szybko.
— mal-wan

@mwan: czy możesz określić, które RDBMS? A ja sam jestem dżokejem na wielbłądach. W moim schemacie wielkie litery służą tylko do jednego celu, do wskazywania tabel łączenia i (w przypadku pól) do wskazywania granic słów, dzięki czemu _ może oznaczać wyłącznie inny identyfikator_tabeli (tj. Nazwa tabeli = inna tabela i pole w tej tabeli = id ). Poza tym, jeśli w drugim RDBMS nie jest rozróżniana wielkość liter, jakie to ma znaczenie? Nigdy nie będę mieć wersji tej samej tabeli, pisanej wielkimi i małymi literami! Aha, i nie wolałbym RDBMS bez rozróżniania wielkości liter - wolę pisać spójny kod
— Samuel Fullman

7
Podoba mi się ironia użytkowników MySQL, którzy nie lubią CamelCase i nazwa produktu, którego używamy: MySQL, napisana w CamelCase
— DBX12

1
@ DBX12 Aby być pedantycznym, to PascalCase, a nie camelCase, ale twój punkt widzenia jest nadal aktualny.
— MarredCheese

@MarredCheese Nigdy o tym nie myślałem, ale masz rację. camelCase nie powinien mieć na początku garbu.
— DBX12

1

Prosta odpowiedź: NIE

Cóż, przynajmniej konwencja nazewnictwa jako taka zachęcana przez Oracle lub społeczność, nie, jednak w zasadzie musisz być świadomy przestrzegania zasad i ograniczeń dotyczących identyfikatorów, takich jak wskazana w dokumentacji MySQL: https://dev.mysql.com /doc/refman/8.0/en/identifiers.html

Jeśli chodzi o konwencję nazewnictwa, którą przestrzegasz, myślę, że jest ok, tylko cyfra 5 jest trochę niepotrzebna, myślę, że większość wizualnych narzędzi do zarządzania bazami danych oferuje opcję sortowania nazw kolumn (używam DBeavera i ma to), więc jeśli celem jest ładna wizualna prezentacja Twojego stołu, możesz skorzystać z tej opcji, o której wspomniałem.

Z własnego doświadczenia poleciłbym to:

  • Użyj małych liter . Zapewnia to prawie współdziałanie podczas migracji baz danych z jednego serwera na inny. Czasami lower_case_table_namesnie jest poprawnie skonfigurowany i serwer zaczyna generować błędy po prostu przez nierozpoznanie standardu camelCase lub PascalCase (problem z rozróżnianiem wielkości liter).
  • Krótkie nazwy . Proste i przejrzyste. Najłatwiej i najszybciej jest zidentyfikować tabelę lub kolumny, tym lepiej. Zaufaj mi, kiedy wykonujesz wiele różnych zapytań w krótkim czasie, lepiej jest mieć wszystko proste do napisania (i odczytania).
  • Unikaj przedrostków . Jeśli nie używasz tej samej bazy danych dla tabel różnych aplikacji, nie używaj przedrostków. To tylko dodaje więcej szczegółowości do twoich zapytań. Są sytuacje, w których może to być przydatne, na przykład, gdy chcesz zidentyfikować klucze podstawowe i klucze obce, że zwykle nazwy tabel są używane jako prefiks dla kolumn id.
  • Użyj podkreślenia do oddzielania słów . Jeśli nadal chcesz użyć więcej niż jednego słowa do nazwania tabeli, kolumny itp., Użyj podkreślenia do separating_the_words , to pomaga w czytelności (Twoje oczy i zestresowany mózg będą Ci wdzięczne).
  • Bądź konsekwentny . Gdy masz już swój własny standard, postępuj zgodnie z nim. Nie bądź osobą, która tworzy zasady i jest pierwszą osobą, która je łamie, to wstyd.

A co z nazewnictwem „Liczba mnoga a liczba pojedyncza”? Cóż, w większości jest to sytuacja dotycząca osobistych preferencji. W moim przypadku staram się używać nazw w liczbie mnogiej dla tabel, ponieważ uważam, że tabela jest zbiorem elementów lub pakietem zawierającym elementy, więc nazwa w liczbie mnogiej ma dla mnie sens; i pojedyncze nazwy kolumn, ponieważ widzę kolumny jako atrybuty opisujące pojedynczo te elementy tabeli.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.