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ć?

StackOverflowNewbie
źródło
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!

Tom Mac
źródło
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).

mal-wan
źródło
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 ...

paulsm4
źródło
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.

Fabrizio Valencia
źródło