Dylemat nazywania tabel: nazwy w liczbie pojedynczej i mnogiej [zamknięte]

1466

Academia twierdzi, że nazwy tabel powinny być liczbą pojedynczą jednostki, której przechowują atrybuty.

Nie lubię T-SQL, który wymaga nawiasów kwadratowych wokół nazw, ale zmieniłem nazwę Userstabeli na liczbę pojedynczą, na zawsze skazując osoby używające tej tabeli, aby czasami musiały używać nawiasów.

Czuję, że lepiej jest pozostać w liczbie pojedynczej, ale mam wrażenie, że nawiasy oznaczają niepożądane, takie jak nazwy kolumn ze spacjami itp.

Powinienem zostać czy pójść?

ProfK
źródło
Duplikacja wcześniejszych nazw tabel bazy danych, w liczbie mnogiej lub pojedynczej , ale ta przyciągnęła więcej uwagi.
poza
7
Dziwi mnie, że więcej ludzi nie mówi: zależy to od tego, co reprezentuje pojedynczy wiersz. W jednej bazie danych mogę mieć tabelę, której wiersze reprezentują pojedynczy pojedynczy widżet, a inna, która jest relacją jeden do wielu z tą tabelą, oznacza, że ​​wiersze reprezentują wiele widżetów. Nie robienie tego traci wyrazistość.
andygavin
1
Chcę tylko dodać, że we wszystkich tych dyskusjach należy pamiętać, że stół w żaden sposób nie kształtuje ani nie tworzy tego samego jak klasa. Tabela jest zbiorem elementów określonego typu, które można sortować, wyszukiwać itp. W odniesieniu do poszczególnych właściwości. Klasa stanowi strukturę opisującą właściwości i zachowanie określonego typu. W terminologii kodowania OO zamknięcie reprezentacji tabeli jest zbiorem obiektów (bez względu na to, jakiego ORM możesz użyć). Jest to zdecydowanie najwyższa odpowiedź Google na ten temat, więc chociaż pytanie jest zamknięte, strona nadal ma wartość.
1
Wybrałbym powszechną praktykę ekosystemu, w którym pracujesz. Na przykład: W Node.js ORM, takie jak Bookshelf.js lub Objection.js, oparte są głównie na „Knex.js”. W dokumentacji „Knex.js” nazwy tabel znajdują się w liczbie mnogiej. Wybrałbym więc liczbę mnogą w tej dziedzinie. Źródło: knexjs.org/#Schema-createTable
Benny Neugebauer
2
Tak, zgadzam się. Warto mieć tabelę użytkowników i jednocześnie nazywać ją „AppUser”, a także mieć tabelę reguł mających zastosowanie do określonego typu użytkownika i nazywać ją „UserRules”
Arindam

Odpowiedzi:

243

Inni dali całkiem dobre odpowiedzi, jeśli chodzi o „standardy”, ale chciałem tylko dodać to ... Czy to możliwe, że „Użytkownik” (lub „Użytkownicy”) nie jest w rzeczywistości pełnym opisem danych przechowywanych w tabeli ? Nie dlatego, że powinieneś zbytnio zwariować na punkcie nazw tabel i ich specyfiki, ale być może bardziej odpowiednie byłoby coś takiego jak „Widget_Users” (gdzie „Widget” to nazwa Twojej aplikacji lub strony internetowej).

Tom H.
źródło
7
Zgadzam się. OrgUsers, AppUsers, wszystko, aby uniknąć używania słowa kluczowego.
MikeW,
7
-1. Użytkownicy tabeli (i kraje, języki) mogą być używane jednocześnie w kilku aplikacjach.
OZ_
129
Czy skojarzenie nazwy schematu nie usunęłoby całego zamieszania? AppName1.Users, AppName2.Users?
Zo ma
7
Nie zgadzam się z przedrostkiem tabeli - to może być schemat? - ale zgadzam się z „bardziej opisową nazwą”. Wystarczyłoby nawet coś tak prostego jak „AppUser”, bez wchodzenia w całą debatę o przestrzeni nazw.
7
Ta zaakceptowana odpowiedź jest raczej komentarzem pobocznym i nie odpowiada na pytanie.
Viliami
1822

Miałem to samo pytanie i po przeczytaniu wszystkich odpowiedzi tutaj zdecydowanie pozostaję przy SINGULAR, powody:

Powód 1 (koncepcja). Możesz pomyśleć o torbie zawierającej jabłka takie jak „AppleBag”, nie ma znaczenia, czy zawiera 0, 1 czy milion jabłek, zawsze jest to ta sama torba. Tabele to po prostu to, że pojemniki, nazwa tabeli musi opisywać, co zawiera, a nie ile danych zawiera. Ponadto pojęcie liczby mnogiej dotyczy bardziej języka mówionego (w rzeczywistości w celu ustalenia, czy istnieje jeden czy więcej).

Powód 2 . (Wygoda). łatwiej jest wyjść z pojedynczymi nazwami niż z mnogimi. Obiekty mogą mieć nieregularne liczby mnogie lub wcale, ale zawsze będą miały liczbę pojedynczą (z kilkoma wyjątkami, takimi jak Wiadomości).

  • Klient
  • Zamówienie
  • Użytkownik
  • Status
  • Aktualności

Powód 3 . (Estetyka i porządek). Zwłaszcza w scenariuszach master-detail, to czyta się lepiej, lepiej wyrównuje się według nazwy i ma bardziej logiczną kolejność (Master pierwszy, Detail drugi):

  • 1. zamówienie
  • 2. Zamówienie Szczegóły

W porównaniu do:

  • 1. Szczegóły zamówienia
  • 2. Zamówienia

Powód 4 (prostota). Podsumowując, nazwy tabel, klucze podstawowe, relacje, klasy jednostek ... lepiej być świadomym tylko jednej nazwy (liczba pojedyncza) zamiast dwóch (klasa pojedyncza, tabela w liczbie mnogiej, pole pojedyncze, liczba pojedyncza-liczba mnoga master-detail .. .)

  • Customer
  • Customer.CustomerID
  • CustomerAddress
  • public Class Customer {...}
  • SELECT FROM Customer WHERE CustomerID = 100

Gdy już wiesz, że masz do czynienia z „klientem”, możesz być pewien, że użyjesz tego samego słowa do wszystkich potrzeb związanych z interakcją z bazą danych.

Powód 5 . (Globalizacja). Świat staje się coraz mniejszy, możesz mieć zespół różnych narodowości, nie każdy ma angielski jako język ojczysty. Łatwiej byłoby programistom w innym języku angielskim myśleć o „repozytorium” niż o „repozytoriach” lub „statusie” zamiast „statusach”. Posiadanie pojedynczych nazw może prowadzić do mniejszej liczby błędów spowodowanych literówkami, oszczędzaj czas, nie myśląc „czy to dziecko czy dzieci?”, A tym samym poprawiając wydajność.

Powód 6 . (Dlaczego nie?). Może nawet zaoszczędzić czas pisania, zaoszczędzić miejsce na dysku, a nawet wydłużyć klawiaturę komputera!

  • SELECT Customer.CustomerName FROM Customer WHERE Customer.CustomerID = 100
  • SELECT Customers.CustomerName FROM Customers WHERE Customers.CustomerID = 100

Zapisałeś 3 litery, 3 bajty, 3 dodatkowe naciśnięcia klawiatury :)

I wreszcie, możesz nazwać tych, którzy mają problemy z zarezerwowanymi nazwami, takimi jak:

  • Użytkownik> LoginUser, AppUser, SystemUser, CMSUser, ...

Lub użyj niesławnych nawiasów kwadratowych [Użytkownik]

Nestor
źródło
624
Założę się, że jeśli umieścisz etykietę na szufladzie skarpety, nazwałbyś ją „Skarpety”.
Chris Ward
73
Zdecydowanie. Trudno jest znaleźć jeden standard, który działa dla wszystkich i dla wszystkich, ważne jest to, że działa dla ciebie. To działa dla mnie i tutaj wyjaśniłem dlaczego, ale znowu, to jest dla mnie i uważam to za bardzo wygodne.
Nestor
451
Większe pytanie, Chris, dlaczego powinieneś przestrzegać konwencji nazewnictwa bazy danych, nazywając szufladę skarpet?
Kyle Clegg,
83
Ta odpowiedź wymaga więcej pochwał. Omawia wiele praktycznych powodów, dla których stosuję się do tego, dlaczego wolę nazwy pojedyncze. Alternatywne dyskusje na temat właściwego języka w odniesieniu do zbiorów są po prostu filozoficzne i przesłaniają prawdziwy punkt widzenia. Liczba pojedyncza po prostu działa lepiej.
Jason
298
W domu mam szufladę „Sock”, a nie szufladę „Socks”. Gdyby to była baza danych, nazwałbym to tabelą „Sock”.
jlembke
260

Jeśli korzystasz z narzędzi mapowania obiektowego lub będzie w przyszłości, sugeruję Singular .

Niektóre narzędzia, takie jak LLBLGen, mogą automatycznie korygować nazwy w liczbie mnogiej, takie jak Użytkownicy dla Użytkownika, bez zmiany samej nazwy tabeli. Dlaczego to ma znaczenie? Ponieważ po zmapowaniu chcesz, aby wyglądał jak User.Name zamiast Users.Name lub gorzej z niektórych moich starych tabel baz danych o nazwie tblUsers.strName, co jest po prostu mylące w kodzie.

Moją nową ogólną zasadą jest ocena, jak będzie wyglądać po przekształceniu w obiekt.

jedna tabela, którą znalazłem, która nie pasuje do nowej nazwy, której używam, to UsersInRoles. Ale zawsze będzie tych kilka wyjątków i nawet w tym przypadku wygląda dobrze jako UsersInRoles.Username.

Brian Boatright
źródło
48
Głosowałem za odrzuceniem i powiem wam dlaczego, ponieważ się nie zgadzam. ORM ze swej natury polega na mapowaniu. Każde narzędzie ORM, którego kiedykolwiek używałem, obsługuje określenie nazwy tabeli, która ma być używana dla encji, gdy jest ona inna niż nazwa encji. Jest to ważne, ponieważ jedynym powodem, dla którego mapujemy do relacyjnych baz danych, jest to, że możemy łatwo tworzyć zapytania i raporty ad hoc o innych kształtach niż nasz model obiektowy. W przeciwnym razie wszyscy już teraz używalibyśmy baz danych obiektów / dokumentów.
joshperry
25
ORM nie powinien dyktować nazw obiektów, na które mapuje. Punkt ORM jest abstrakcją obiektu, nadającą mu elastyczność.
barrypicker
19
W moim świecie staram się używać spójnych nazw w całym projekcie, aby uniknąć marnowania czasu na zastanawianie się, czy to wystąpienie ma s na końcu, czy nie. Fakt, że ORM może zmieniać nazwę i być niezależny, nie oznacza, że ​​pomaga to innym programistom.
John Nicholas
2
Niektóre ORM (podobnie jak wiele narzędzi programistycznych) mają domyślne zachowanie, które generuje implementacje bez konfiguracji ... z zaletą PRODUCTIVITY. Tak więc utworzenie klasy pracownika bez wyraźnego mapowania wygenerowałoby domyślnie tabelę pracowników
user919426
1
@barrypicker. Liczba mnoga nie tylko wygląda głupio w kodzie ORM. Liczby mnogie również wyglądają źle w SQL, szczególnie w odniesieniu do unikalnego atrybutu. Kto nigdy nie napisał wybierz user.id od użytkowników? A może ... od pozostawionych użytkowników dołącz do thingy.user_id = user.id ...?
Samuel Danielson
219

Wolę używać niezmienionego rzeczownika, który po angielsku bywa osobliwy.

Odmienianie numeru nazwy tabeli powoduje problemy ortograficzne (jak pokazuje wiele innych odpowiedzi), ale wybranie takiej opcji, ponieważ tabele zwykle zawierają wiele wierszy, jest również semantycznie pełne dziur. Jest to bardziej oczywiste, jeśli weźmiemy pod uwagę język, który odmienia rzeczowniki na podstawie wielkości liter (jak większość):

Ponieważ zwykle robimy coś z wierszami, dlaczego nie umieścić nazwy w bierniku? Jeśli mamy tabelę, do której piszemy więcej niż czytamy, dlaczego nie umieścić tej nazwy w celowniku? Jest to stół z czegoś, czemu nie skorzystać dopełniacz? Nie zrobilibyśmy tego, ponieważ tabela jest zdefiniowana jako abstrakcyjny kontener, który istnieje niezależnie od jego stanu lub użycia. Odmienianie rzeczownika bez dokładnego i absolutnego powodu semantycznego jest gaworzeniem.

Używanie niezmienionego rzeczownika jest proste, logiczne, regularne i niezależne od języka.

Ian Mackinnon
źródło
37
Prawdopodobnie najbardziej logiczny argument na ten temat, jaki kiedykolwiek widziałem, i cieszę się, że spędziłem ten czas na łacinie. +1 na pewno.
52
Cóż, wyraźnie muszę uzupełnić swoje słownictwo.
TJ Biddle
19
+1 Zobacz, to są rodzaje odpowiedzi, których Internet potrzebuje bardziej. Bezbłędne dowody przy użyciu bogatego słownictwa do wykonania idealnej logiki.
OCDev
8
Zanotuję to przy następnym programowaniu w języku łacińskim. W międzyczasie użytkownicy przejdą do tabeli użytkowników, a klienci do tabeli klientów.
Caltor,
8
Przekonany - jest niezmieniony. Ciekawe, że po tak długim czasie, popularne wybory „osobliwy” i „liczba mnoga” są zarówno w błędzie!
Stuart,
126

Jaka konwencja wymaga, aby tabele miały nazwy pojedyncze? Zawsze myślałem, że to liczby mnogie.

Użytkownik zostanie dodany do tabeli Użytkownicy.

Ta strona zgadza się:
http://vyaskn.tripod.com/object_naming.htm#Tables

Ta strona się nie zgadza (ale ja się z tym nie zgadzam):
http://justinsomnia.org/writings/naming_conventions.html


Jak wspomnieli inni: są to tylko wytyczne. Wybierz konwencję, która działa dla Ciebie i Twojej firmy / projektu i trzymaj się jej. Przełączanie między słowami pojedynczymi i mnogimi lub czasami skrótem, a czasem nie jest o wiele bardziej irytujące.

Michael Haren
źródło
46
Przy stosowaniu teorii zbiorów do tabel każda instancja w zestawie jest reprezentatywna dla zestawu, więc Apple jest zestawem Apple, niezależnie od tego, ile jabłek jest w zestawie - jest to Apple z wieloma instancjami. „Worek” jabłek nie staje się „woreczkiem”, gdy zawiera wiele jabłek.
ProfK,
89
Co jeśli masz w środku torbę z 5 jabłkami? Nazywasz to torebką jabłka? czy worek jabłek?
Christopher Mahan
26
Myślę, że teorią byłoby, że zestaw nazywa się Jabłka. Jednoosobowe jabłko wciąż jest „zestawem jabłek” - aczkolwiek zestawem z jednym wystąpieniem. Wiele jabłek to także „zestaw jabłek”.
Mark Brackett,
26
@Christopher, jeśli raison d'être torby ma pomieścić jabłka i tylko jabłka, to jest to „torba na jabłka”, niezależnie od tego, czy zawiera 1 jabłko, 100 jabłek, czy też nie.
Ian Mackinnon
14
@ Ian: To dlatego, że stół jest ogólny i można go porównać do kontenera wysyłkowego (może zawierać prawie wszystko, od skrzynek na jabłka po skrzynki motocykli Harley Davidson). Mówisz: kontener z pomarańczami, a nie pomarańczowy kontener. Mówisz: kontener na części samochodowe, a nie kontener na części samochodowe. Jeśli utworzyłeś niestandardową strukturę danych przeznaczoną do przechowywania tylko określonego rodzaju danych, takich jak nazwy jabłek, i nazwałeś ją „kungabogo”, możesz mieć jabłko kungaboko. Wiem, co myślisz, ale najpierw pomyśl o woreczku z piłkami i rozumiem różnicę w znaczeniu.
Christopher Mahan,
79

A może to prosty przykład:

SELECT Customer.Name, Customer.Address FROM Customer WHERE Customer.Name > "def"

vs.

SELECT Customers.Name, Customers.Address FROM Customers WHERE Customers.Name > "def"

SQL w drugim przypadku brzmi dziwniej niż pierwszy.

Głosuję za liczbą pojedynczą .

James
źródło
49
W tym przykładzie tak, ale w praktyce nigdy nie byłoby tak napisane. Miałbyś alias stołowy, więc byłoby bardziej jakSELECT C.Name, C.Address FROM Customers WHERE Customers.Name > 'def'
Michael Haren
+1, (rok później) zacytowałeś TERRIFIC przykład, jak liczba pojedyncza ma sens. To jest nieco religijna debata. Kilka lat temu zostałem przemieniony w osobliwy przez architekta danych, który przez wiele lat był moim starszym pracownikiem, i uważam to za słuszne (po tym, jak musiałem przekonać mnie do zmiany).
Chris Adragna
24
Myślę, że sql brzmi lepiej w liczbie mnogiej. Nie masz nazw tabel dla każdej kolumny, dlaczego tak lubisz pisać. WYBIERZ Nazwa, adres OD KLIENTÓW GDZIE Nazwa> „def” Wybierasz z puli klientów, których nazwa jest większa niż def.
Jamiegs,
6
Co powiesz na użycie aliasu / AS w celu obejścia tego jednego problemu? WYBIERZ Customer.Name, Customer.Address Od klientów jako klient GDZIE Customer.Name> "def"
James Hughes
1
Drugi brzmi znacznie lepiej, osobliwy brzmi jak ktoś, kto nie mówi po angielsku.
HLGEM,
61

Jestem głęboko przekonany, że na diagramie relacji między bytami byt powinien być odzwierciedlony za pomocą pojedynczej nazwy, podobnej do pojedynczej nazwy klasy. Po utworzeniu instancji nazwa odzwierciedla jej instancję. W przypadku baz danych jednostka po przekształceniu w tabelę (zbiór jednostek lub rekordów) jest liczbą mnogą. Podmiot, Użytkownik jest wprowadzany do tabeli Użytkownicy. Zgadzam się z innymi, którzy sugerowali, że być może nazwa użytkownika może zostać zmieniona na pracownika lub coś bardziej odpowiedniego do twojego scenariusza.

Ma to wtedy większy sens w instrukcji SQL, ponieważ wybierasz z grupy rekordów, a jeśli nazwa tabeli jest pojedyncza, nie czyta się dobrze.

Adam Carr
źródło
3
Szczególnie podoba mi się komentarz instrukcji SQL. Używanie tutaj liczby pojedynczej nie jest intuicyjne dla czytelnika.
hochl
2
Doskonały punkt na temat ERD. Podejrzewam, że właśnie dlatego, dla kogoś, kto widzi świat oczami DBA, pojedyncze nazewnictwo ma sens. Podejrzewam, że nie dostają, jak zauważyłeś, różnicy między bytem a ich kolekcją.
William T. Mallard
1
Tabela nie jest zbiorem rekordów; tabela jest definicją tego, jak wygląda rekord. To rozłączenie, które wydaje się mieć wiele osób w liczbie mnogiej / pojedynczej.
rich remer
Nie zgadzam się z komentarzem instrukcji SQL. Co jeśli chcesz dołączyć do Users.Id
hashtable
1
Jeden old_lady ma wiele kotów LUB old_ladies ma koty. Myślę, że ERD czytają ładniej jako liczbę mnogą. I tabela bytów, tabele mają wiele bytów, więc znowu myślę, że liczba mnoga brzmi nieźle.
user3121518,
39

Trzymam się liczby pojedynczej dla nazw tabel i wszelkich bytów programujących.

Powód? Fakt, że w języku angielskim występują nieregularne formy liczby mnogiej, takie jak mysz ⇒ myszy i owce ⇒ owce . Następnie, jeśli potrzebuję kolekcji , po prostu używam myszy lub owiec i idę dalej.

Naprawdę pomaga wielu wyróżnić się i mogę łatwo i programowo określić, jak będzie wyglądać zbiór rzeczy.

Tak więc, moja zasada brzmi: wszystko jest w liczbie pojedynczej, każda kolekcja rzeczy jest w liczbie pojedynczej z dołączonym s . Pomaga również w przypadku ORM.

Paulo Freitas
źródło
7
co ze słowem kończącym się na „s”? Jeśli masz tabelę „Wiadomości” (jako przykład), jak nazwałbyś kolekcję wiadomości? Aktualności? Czy nazwałbyś stół „Nowym”?
Anthony
18
Nazwałbym tabelę NewsItem i kolekcję NewsItems.
Ash Machine
5
Co jeśli będziesz musiał sprawdzić pisownię całego kodu, bo inaczej się nie skompiluje;)?
Hamish Grubijan
2
ORM nie powinien dyktować nazw obiektów, na które mapuje. Punkt ORM jest abstrakcją obiektu, nadającą mu elastyczność.
barrypicker
16
@HamishGrubijan, a następnie przestań używać programu Word do pisania kodu! ;)
Valentino Vranken
36

IMHO, nazwy tabel powinny być w liczbie mnogiej jak w przypadku klientów .

Nazwy klas powinny być pojedyncze, tak jak Klient, jeśli są odwzorowane na wiersz w tabeli Klienci .

Gulzar Nazim
źródło
33

Pojedynczy. Nie kupuję żadnego argumentu, który jest najbardziej logiczny - każda osoba uważa, że ​​jego własne preferencje są najbardziej logiczne. Bez względu na to, co robisz, jest to bałagan, wystarczy wybrać konwencję i trzymać się jej. Próbujemy zmapować język o bardzo nieregularnej gramatyce i semantyce (normalny język mówiony i pisany) na wysoce regularną (SQL) gramatykę o bardzo specyficznej semantyce.

Moim głównym argumentem jest to, że nie myślę o tabelach jako zestawie, ale o relacjach.

Tak więc AppUserrelacja mówi, które jednostki są AppUsers.

AppUserGroupRelacja mówi mi, jakie podmioty sąAppUserGroups

AppUser_AppUserGroupRelacja mówi mi, w jaki sposób AppUsersi AppUserGroupssą powiązane.

AppUserGroup_AppUserGroupRelacja mówi mi, jak AppUserGroupsi AppUserGroupszwiązane są (tzn grupy członkiem grupy).

Innymi słowy, kiedy myślę o bytach i ich powiązaniach, myślę o relacjach w liczbie pojedynczej, ale oczywiście, gdy myślę o bytach w zbiorach lub zbiorach, zbiory lub zbiory są mnogie.

Zatem w moim kodzie i schemacie bazy danych używam liczby pojedynczej. W opisach tekstowych używam liczby mnogiej dla zwiększenia czytelności - następnie używam czcionek itp., Aby odróżnić nazwę tabeli / relacji od liczby mnogiej.

Lubię myśleć o tym jako bałaganiarski, ale systematyczny - w ten sposób zawsze pojawia się systematycznie generowana nazwa relacji, którą chcę wyrazić, co jest dla mnie bardzo ważne.

Jacob Lorensen
źródło
1
dokładnie. najważniejsze jest to, że wiele osób nie zdaje sobie sprawy z tego, jak się nazywają ... nadajesz nazwę relacji (pojedynczy rekord w tabeli), a nie zestaw rekordów w tabeli.
Alexandre Martini,
3
Nie można się nie zgodzić. „Wybierz * spośród użytkowników, których nazwa jak„ J% ”, ponieważ wybieram wszystkich użytkowników, których nazwa zaczyna się na„ J ”. Jeśli argumentujesz, że chcesz napisać „... gdzie Nazwa użytkownika jak…”, po prostu użyj aliasu. Z tego samego powodu mówię „Daj mi parę ze wszystkich dostępnych skarpet”.
Mark A. Donohoe
Gdybym był taki, nazwa mojego stołu to sock_pair
Manuel Hernandez
@AlexandreMartini Dokładnie. Jak niektórzy ludzie, którzy nazywają pojedynczy rekord w tabeli „relacją”.
Nuno André
31

Chciałbym również przejść do liczby mnogiej , a przy wspomnianym wyżej dylemacie użytkowników przyjmujemy podejście do nawiasów kwadratowych.

Robimy to, aby zapewnić jednolitość zarówno architektury bazy danych, jak i architektury aplikacji, przy podstawowym zrozumieniu, że tabela Użytkownicy jest zbiorem wartości użytkownika , podobnie jak kolekcja użytkowników w artefakcie kodu jest zbiorem obiektów użytkownika .

Posiadanie naszego zespołu danych i naszych programistów mówiących tym samym językiem pojęciowym (choć nie zawsze tymi samymi nazwami obiektów) ułatwia przekazywanie pomysłów między nimi.

Paulo Freitas
źródło
8
Zgadzam się ... dlaczego niespójność między kodem a pamięcią? Nigdy nie nazwałbym kolekcji obiektów użytkownika „Użytkownik” w kodzie ... więc dlaczego miałbym tak nazywać tabelę? To nie ma sensu. Kiedy czytam powyższe argumenty, koncentrują się one na bycie, a nie na stole ... w mojej głowie rozróżnia się to, co jest w tabeli niż sam stół.
Jason
Jak radzisz sobie z nazwą tabeli, np. companiesTam, gdzie inne tabele mają wywołane pole odniesienia company_id? Chociaż jest poprawnie napisany, wydaje się niespójny dla tych, którzy są wybredni w zakresie konwencji nazewnictwa tabel.
Jake Wilson,
1
Pamiętając, że liczba pojedyncza companiesjest company, i że ten identyfikator jest odniesieniem do pojedynczej pozycji. Nie powinno nam to przeszkadzać w kodzie bardziej niż w języku angielskim.
David
22

Osobiście wolę używać mnogiej nazwy do przedstawienia zestawu, to po prostu „brzmi” lepiej dla mojego relacyjnego umysłu.

W tym właśnie momencie używam pojedynczych nazw, aby zdefiniować model danych dla mojej firmy, ponieważ większość osób w pracy czuje się z nim bardziej komfortowo. Czasami po prostu musisz ułatwić wszystkim życie, zamiast narzucać swoje osobiste preferencje. (tak skończyłem w tym wątku, aby uzyskać potwierdzenie, co powinno być „najlepszą praktyką” w przypadku nazewnictwa tabel)

Po przeczytaniu wszystkich argumentów w tym wątku doszedłem do jednego wniosku:

Lubię moje naleśniki z miodem, bez względu na ulubiony smak każdego. Ale jeśli gotuję dla innych ludzi, postaram się im podać coś, co im się podoba.

ktoś
źródło
Nie jest rozsądne stosowanie takiej konwencji w świecie modeli relacyjnych, szczególnie gdy opisuje się relacje między obiektami, np. „Każda drużyna może mieć tylko jednego trenera głównego i wielu drugorzędnych trenerów”, co opisano: Drużyna-> Trener główny, Drużyna - >> SecondaryCoach
noonex
16

Pojedynczy. Nazwałbym tablicę zawierającą kilka obiektów reprezentujących wiersze użytkowników „użytkownikami”, ale tabela jest „tabelą użytkowników”. Myślenie, że tabela jest niczym innym jak zbiorem wierszy, które zawiera, jest błędne, IMO; tabela to metadane, a zestaw wierszy jest hierarchicznie dołączony do tabeli, nie jest to sama tabela.

Oczywiście używam ORM przez cały czas i pomaga to, że kod ORM napisany za pomocą nazw w liczbie mnogiej wygląda głupio.

chaos
źródło
Chyba każdy z nich. Tabela relacyjnych baz danych jest z definicji nagłówkiem (tj. Metadanymi nazywającymi atrybuty) i zestawem krotek pasujących do nagłówka. Możesz skupić się na metadanych, podczas gdy inni ludzie skupiają się na krotkach. :-)
Bill Karwin
Hej, User_Table to imię, które lubię! :)
Camilo Martin
3
ORM nie powinien dyktować nazw obiektów, na które mapuje. Punkt ORM jest abstrakcją obiektu, nadającą mu elastyczność.
barrypicker
1
Patrzę na to w ten sposób ... jeśli utworzysz tablicę / listę / słownik dowolnego kodu, założę się, że nazywasz go liczbą mnogą tego, co zawiera. Jeśli używasz ORM do abstrakcji bazy danych, tabele są reprezentowane przez jakąś kolekcję, więc dlaczego miałbyś traktować je inaczej? Używanie pojedynczych nazw może zabrzmieć dobrze, ale zawsze walczysz ze swoim instynktem, że tabela zawiera wiele takich samych rzeczy, podobnie jak kolekcja w kodzie. Dlaczego niespójność?
Jason
@Jason: proszę porównać i sposób odczytać te rzeczy: 1) $db->user->row(27), $db->product->rows->where(something) 2) $db->users->row(27), $db->products->rows->where(something).
chaos,
16

Właściwie zawsze uważałem, że popularną konwencją jest używanie nazw w liczbie mnogiej. Do tego momentu zawsze używałem liczby mnogiej.

Rozumiem argument za pojedynczymi nazwami tabel, ale dla mnie liczba mnoga ma większy sens. Nazwa tabeli zazwyczaj opisuje jej zawartość. W znormalizowanej bazie danych każda tabela zawiera określone zestawy danych. Każdy wiersz jest jednostką, a tabela zawiera wiele jednostek. Zatem liczba mnoga dla nazwy tabeli.

Tabela samochodów miałaby nazwę samochody, a każdy rząd to samochód. Przyznaję, że sprecyzowanie tabeli wraz z polem table.fieldjest najlepszą praktyką i że posiadanie pojedynczych nazw tabel jest bardziej czytelne. Jednak w poniższych dwóch przykładach pierwszy ma większy sens:

SELECT * FROM cars WHERE color='blue'
SELECT * FROM car WHERE color='blue'

Szczerze, ponownie przemyślę swoje stanowisko w tej sprawie i będę polegał na faktycznych konwencjach stosowanych przez organizację, dla której rozwijam się. Myślę jednak, że w przypadku moich osobistych konwencji będę się trzymał liczby mnogiej nazw tabel. Dla mnie ma to większy sens.

Randy
źródło
9
Czy to też nie jest konwencja w RoR? Liczba mnoga dla tabel i liczba pojedyncza dla klas ORM? Ma dla mnie wiele sensu. Tabela nazywa się „samochodami”, ponieważ ma wiele wystąpień „samochodu”, a klasa nazywa się „samochodem”, ponieważ pomieści jedną instancję samochodu !!
Sap
@Sap Niewielka korekta drugiej części zdania - klasa „Samochód” jest abstrakcyjnym typem danych reprezentującym prawdziwy samochód. To, czy pomieści jedną instancję, czy wielokrotność, zależy od sposobu jej użycia.
asgs 10.10.16
spójrzmy prawdzie w oczy, tabela carjest definicją struktury pojedynczego samochodu. Jeśli spojrzysz na strukturę tabeli, wypluje ona w zasadzie „id int, kolor string itp.” Ponadto: powiedz, że masz tabelę car_vendor(lub dla wersji w liczbie mnogiej cars_vendor) z kluczem obcym cars_id?! co to za głupie gówno? to car_id nie ma potrzeby, aby mnie sądzić. Singular jest przeze mnie zdecydowanie preferowany
Toskan
4
Naprawdę podoba mi się ta odpowiedź! Pozwól mi wyjaśnić. Jeśli kolekcja jest cari chcesz wszystko od tego car, to bluewynik powinien być podobny tire, mirror, engine. A potem robi się mylące, ponieważ wszystkie wyniki pochodzą partsz car. Tak więc nazwa tabeli powinna byćcarparts (lub car_parts,CarParts co chcesz)
arnoudhgz
Każdy projektant bazy danych, który wymusza pojedyncze nazwy tabel, w zasadzie wypowiada wojnę wszystkim twórcom aplikacji Ruby on Rails, którzy mogą się z nią skontaktować w przyszłości. Ścisłe naleganie Raila na pojedyncze słowa dla klas i mnogie nazwy tabel umożliwiają wiele silnych zachowań w obrębie wielu klejnotów w ekosystemie Ruby. Więc nawet jeśli uważasz, że liczba pojedyncza brzmi lepiej, ze względu na kompatybilność powinieneś trzymać się liczby mnogiej. Wyobrażam sobie, że dotyczy to również wielu innych mapujących obiektowo.
Kelsey Hannan
15

Nie lubię nazw w liczbie mnogiej, ponieważ niektóre rzeczowniki w języku angielskim nie są policzalne (woda, zupa, gotówka) lub znaczenie zmienia się, gdy je policzasz (kurczak kontra kurczak; mięso kontra ptak). Nie lubię też używać skrótów dla nazwy tabeli lub nazwy kolumny, ponieważ powoduje to dodatkowe nachylenie już i tak stromej krzywej uczenia się.

Jak na ironię, mogę zrobić Userwyjątek i nazwać go z Userspowodu USER (Transac-SQL) , ponieważ ja też nie lubię używać nawiasów wokół tabel, jeśli nie muszę.

Lubię też nazywać wszystkie kolumny identyfikatorów jako Id, nie ChickenIdlub ChickensId(co robią w tym przypadku mnisi faceci?).

Wszystko to dlatego, że nie mam właściwego szacunku dla systemów baz danych, po prostu ponownie stosuję wiedzę opartą na jednym kucyku z konwencjami nazewnictwa OO, takimi jak Java z przyzwyczajenia i lenistwa. Chciałbym, żeby była lepsza obsługa IDE dla skomplikowanego SQL.

Eugene Yokota
źródło
8
My, liczba mnoga, albo nazywamy identyfikator kolumny „id” jak ty, albo „singular_id”. Uważam, że tabele powinny być w liczbie mnogiej (myśl o nich jak o tablicach), ale nazwy kolumn powinny być w liczbie pojedynczej (atrybuty pojedynczego elementu).
mpen
plu_ral / PluRal dla nazw tabel, singular_id / singularId dla kluczy podstawowych.
hochl
14

Działamy według podobnych standardów, gdy skrypt wymaga [] wokół nazw i, w stosownych przypadkach, kwalifikatorów schematu - przede wszystkim zabezpiecza twoje zakłady przed przyszłymi chwytaniem nazw przez składnię SQL.

SELECT [Name] FROM [dbo].[Customer] WHERE [Location] = 'WA'

To uratowało nasze dusze w przeszłości - niektóre z naszych systemów baz danych pracowały ponad 10 lat od SQL 6.0 do SQL 2005 - znacznie wcześniej niż zamierzały.

stephbu
źródło
Wydaje się, że rytualne samozachowanie. Czy zdarzały się już takie chwytania nazwisk?
Kjetil S.
13

Tabele: liczba mnoga

W tabeli użytkowników znajduje się wielu użytkowników.

Modele: pojedyncze

Pojedynczego użytkownika można wybrać z tabeli użytkowników.

Kontrolery: liczba mnoga

http://myapp.com/users wyświetli listę wielu użytkowników.

W każdym razie to moje zdanie.

Andrzej
źródło
1
Bliżej mojego zdania, ale moje jest to, że przechowywanie w tabeli wielu użytkowników jest w rzeczywistości przypadkowe i że każdy pojedynczy użytkownik jest reprezentowany przez tabelę, a raczej relację, która jest zbiorem krotek reprezentujących byt użytkownika.
ProfK
Chyba się z tym zgadzam. Jedyne, co mnie dezorientuje, to dlaczego modele powinny być pojedyncze? Tylko jeśli model dotyczy tylko jednego użytkownika. Gdybym pytał bazy danych, aby uzyskać wszystkich użytkowników, czy musiałbym uzyskać dostęp do modelu? Pobranie wszystkich rekordów przez pojedyncze wystąpienie nie ma sensu, na przykład: $ user-> get_all () // nie ma sensu
PM7Temp
12

Jestem fanem pojedynczych nazw tabel, ponieważ ułatwiają czytanie moich diagramów ER przy użyciu składni CASE, ale czytając te odpowiedzi, mam wrażenie, że nigdy nie przyjął się zbyt dobrze? Ja osobiście to uwielbiam. Jest dobry przegląd z przykładami tego, jak czytelne mogą być twoje modele, kiedy używasz pojedynczych nazw tabel, dodajesz czasowniki akcji do twoich relacji i tworzysz dobre zdania dla każdej relacji. To trochę przesada w bazie danych zawierającej 20 tabel, ale jeśli masz bazę danych z setkami tabel i złożoną konstrukcję, jak deweloperzy kiedykolwiek to zrozumieją bez dobrego czytelnego schematu?

http://www.aisintl.com/case/method.html

Jeśli chodzi o prefiksowanie tabel i widoków, absolutnie nie znoszę tej praktyki. Nie udzielaj żadnej informacji, zanim przekażesz potencjalnie złe informacje. Każdy, kto przegląda bazę danych obiektów, może dość łatwo odróżnić tabelę od widoku, ale jeśli mam tabelę o nazwie tblUsers, z jakiegoś powodu decyduję się na restrukturyzację w przyszłości na dwie tabele, z widokiem ujednolicającym je, aby nie złamać starego kodu Mam teraz widok o nazwie tblUsers. W tym momencie pozostały mi dwie nieprzyjemne opcje, pozostaw widok nazwany z prefiksem tbl, który może wprowadzić w błąd niektórych programistów lub wymusić przepisanie innej warstwy, warstwy środkowej lub aplikacji, aby odwoływały się do mojej nowej struktury lub nazwy viewUsers. To neguje dużą część wartości wyświetleń IMHO.

Shane Delmore
źródło
1
Dobry przykład pułapki prefiksowania nazw obiektów za pomocą kwalifikatora „typ”!
Kenny Evitt,
12

System tables/viewssamego serwera ( SYSCAT.TABLES, dbo.sysindexes, ALL_TABLES, information_schema.columns, itd.) Są prawie zawsze w liczbie mnogiej. Wydaje mi się, że dla zachowania spójności podążałbym za nimi.

Michel
źródło
Microsoft jest tym, czym są najpierw z powodów biznesowych (i często nieetyczne), a logiczne - ostatnie. Moim jedynym powodem, aby je śledzić, jest to, że są wielkim gorylem i wszyscy inni podążają tą drogą. Kiedy mam wybór, wybieram inny sposób.
Bruce Patin
1
Należy zauważyć, że information_schemajest to część normy SQL ISO / IEC 9075-11. I tak, używa wielu nazw tabel / widoków.
Paulo Freitas
10

Jeśli spojrzymy na MS SQL Server'stabele systemowe, znajdują się ich nazwy przypisane przez Microsoftplural .

Tabele systemowe Oracle są nazywane singular . Chociaż kilka z nich jest w liczbie mnogiej. Oracle zaleca liczbę mnogą dla nazw tabel zdefiniowanych przez użytkownika. To nie ma sensu, że polecają jedną rzecz i podążają za drugą. To, że architekci tych dwóch gigantów oprogramowania nazwali swoje stoły przy użyciu różnych konwencji, również nie ma większego sensu ... W końcu, co to za faceci ... doktoranci?

Pamiętam, że w środowisku akademickim zalecenie było osobliwe.

Na przykład, gdy mówimy:

select OrderHeader.ID FROM OrderHeader WHERE OrderHeader.Reference = 'ABC123'

może b / c każdy IDjest wybrany z konkretnego pojedynczego rzędu ...?

Richard
źródło
1
Microsoft jest tym, czym są najpierw z powodów biznesowych (i często nieetyczne), a logiczne - ostatnie. Moim jedynym powodem, aby je śledzić, jest to, że są wielkim gorylem i wszyscy inni podążają tą drogą. Kiedy mam wybór, wybieram inny sposób.
Bruce Patin
Dwie rzeczy. Po pierwsze, zwykle nie używałbyś nazw tabel i napisałbyś „wybierz identyfikator z OrderHeaders WHERE Reference = 'ABC123”, ponieważ „wybierasz wszystkie identyfikatory z OrderHeaders, w których coś jest prawdą”, ale gdybyś musiał użyć nazw tabel z powodu dołączyć, czy cokolwiek innego, użyłbyś takiego aliasu ... ”wybierz OrderHeader.ID FROM OrderHeaders jako OrderHeader GDZIE OrderHeader.Reference = 'ABC123'
Mark A. Donohoe
9

Może to być trochę zbędne, ale sugerowałbym ostrożność. Niekoniecznie dlatego, że zmiana nazw tabel jest zła, ale standaryzacja jest właśnie taka; standard - ta baza danych może być już „znormalizowana”, jednak źle :) - Sugerowałbym spójność, aby być lepszym celem, biorąc pod uwagę, że ta baza danych już istnieje i prawdopodobnie składa się z więcej niż 2 tabel.

O ile nie możesz ujednolicić całej bazy danych lub przynajmniej planujesz pracować nad tym celem, podejrzewam, że nazwy tabel są tylko wierzchołkiem góry lodowej i koncentrowanie się na zadaniu, znosząc ból źle nazwanych obiektów, może być twój najlepszy interes -

Praktyczna konsekwencja bywa czasem najlepszym standardem ... :)

my2cents ---

Borzio
źródło
9

Możliwe alternatywy:

  • Zmień nazwę tabeli SystemUser
  • Użyj nawiasów
  • Zachowaj nazwy tabel w liczbie mnogiej.

IMO za pomocą nawiasów jest technicznie najbezpieczniejszym podejściem, choć jest nieco kłopotliwe. IMO to 6 z jednego, pół tuzina innych, a twoje rozwiązanie naprawdę sprowadza się do preferencji osobistych / zespołowych.

Dave Markle
źródło
2
Podoba mi się twój pomysł na „prefiks”, ale nazwałbym go SystemUser.
ProfK,
9

Moje podejście jest semantyką w zależności od tego, jak zdefiniujesz swój kontener. Na przykład „worek jabłek” lub po prostu „jabłka” lub „worek jabłek” lub „jabłko”.

Przykład: tabela „college” może zawierać 0 lub więcej szkół, tabela „college” może zawierać 0 lub więcej szkół

a "student" table can contain 0 or more students 
a table of "students" can contain 0 or more students.

Doszedłem do wniosku, że jedno z nich jest w porządku, ale musisz zdefiniować, w jaki sposób (lub osoby wchodzące z nim w interakcje) podejdziesz, odnosząc się do tabel; „tabela toporów” lub „tabela xs”

jleviaguirre
źródło
8

Jak wspomnieli tu inni, konwencje powinny być narzędziem zwiększającym łatwość użycia i czytelność. Nie jako kajdany lub klub dla deweloperów tortur.

To powiedziawszy, moje osobiste preferencje to używanie pojedynczych nazw dla tabel i kolumn. Prawdopodobnie pochodzi to z mojego programowania. Nazwy klas są generalnie pojedyncze, chyba że są jakimś zbiorem. W mojej pamięci przechowuję lub czytam poszczególne rekordy w danej tabeli, więc liczba pojedyncza ma dla mnie sens.

Ta praktyka pozwala mi również rezerwować nazwy tabel w liczbie mnogiej dla tych, które przechowują relacje wiele do wielu między moimi obiektami.

Staram się również unikać słów zastrzeżonych w nazwach tabel i kolumn. W omawianym przypadku bardziej sensowne jest przeciwstawienie się pojedynczej konwencji dla Użytkowników, aby uniknąć konieczności enkapsulacji tabeli, która używa zarezerwowanego słowa Użytkownika.

Lubię używać prefiksów w ograniczony sposób (tbl dla nazw tabel, sp_ dla nazw proc itp.), Choć wielu uważa, że ​​to dodaje bałaganu. Wolę także nazwy CamelBack niż podkreślenia, ponieważ zawsze wpisuję nazwę, naciskając + zamiast zamiast _. Wielu innych się nie zgadza.

Oto kolejny dobry link do wytycznych konwencji nazewnictwa: http://www.xaprb.com/blog/2008/10/26/the-power-of-a-good-sql-naming-convention/

Pamiętaj, że najważniejszym czynnikiem w konwencji jest to, że ma ona sens dla osób wchodzących w interakcję z bazą danych, o której mowa. W przypadku konwencji nazewnictwa nie ma „jednego pierścienia, który rządzi nimi wszystkimi”.

Chris
źródło
18
Ignorując okropności węgierskiej notacji. Nigdy, nigdy, nigdy nie używaj sp_ przed procedurami przechowywanymi, ponieważ MS-SQL używa tego do systemowych procedur przechowywanych i traktuje je jako specjalne. Ponieważ sp_ są przechowywane w tabeli głównej, MS-SQL zawsze wygląda najpierw na nich, nawet jeśli kwalifikujesz lokalizację.
Will Dieterich,
8

Myślę, że używanie liczby pojedynczej było tym, czego nauczono nas na uniwersytecie. Ale jednocześnie można argumentować, że w przeciwieństwie do programowania obiektowego tabela nie jest instancją jej rekordów.

Myślę, że obecnie przechylam się na rzecz liczby pojedynczej z powodu mnogich nieprawidłowości w języku angielskim. W języku niemieckim jest jeszcze gorzej z powodu braku spójnych form liczby mnogiej - czasami nie można stwierdzić, czy słowo jest liczbą mnogą, czy nie bez określonego artykułu przed nim (der / die / das). W językach chińskich i tak nie ma form liczby mnogiej.

helloworlder
źródło
Na uniwersytecie uczę się liczby mnogiej na stoły, mam też tutaj książkę, DB zarządzanie trzecim wydaniem z lat 90-tych, tabele są pojedyncze; podczas gdy mam również zaktualizowaną kopię, 11e, liczbę pojedynczą i niektóre skrócone nazwy, podczas gdy sekcja XML używa liczby mnogiej. \ n Ale jeśli sprawdzisz rzeczywistą zawartość sekcji RDBMS, to dosłownie nadal będzie to ten sam tekst, a niektóre obrazy zostały poprawione. \ n „Lista kontrolna modelowania danych” nie podaje niczego w liczbie mnogiej w stosunku do liczby pojedynczej, tylko że byty powinny mapować tylko do jednego obiektu, prawdopodobnie to właśnie próbowali wymusić w książkach.
Marco
8

Kiedyś użyłem „Koleś” w tabeli użytkowników - ta sama krótka liczba znaków, brak konfliktu ze słowami kluczowymi, wciąż odniesienie do zwykłego człowieka. Gdybym nie martwił się dusznymi głowami, które mogą zobaczyć kod, zachowałbym go w ten sposób.

Bruce Patin
źródło
8

Zawsze używałem liczby pojedynczej po prostu dlatego, że mnie tego nauczono. Jednak podczas tworzenia nowego schematu niedawno, po raz pierwszy od dłuższego czasu, aktywnie zdecydowałem się utrzymać tę konwencję tylko dlatego, że ... jest krótsza. Dodanie „s” na końcu każdej nazwy tabeli wydaje mi się równie bezużyteczne, jak dodanie „tbl_” przed każdym.

Just Some Guy
źródło
7

Zawsze myślałem, że to głupia konwencja. Używam nazw tabel w liczbie mnogiej.

(Uważam, że uzasadnieniem tej zasady jest to, że ułatwia generatorom kodów ORM tworzenie klas obiektów i kolekcji, ponieważ łatwiej jest utworzyć liczbę mnogą z nazwy pojedynczej niż odwrotnie)

James Curran
źródło
11
Konwencja ta stanowi część teorii relacji na długo, zanim jeszcze istniał ORM.
ProfK,
1
ORM nie powinien dyktować nazw obiektów, na które mapuje. Punkt ORM jest abstrakcją obiektu, nadającą mu elastyczność.
barrypicker
7

Używam tylko rzeczowników w nazwach tabel, które są tak samo pisane, zarówno w liczbie pojedynczej, jak i mnogiej:

łoś ryba jeleń samolot sam spodnie szorty okulary nożyczki gatunki potomstwo

konstabl
źródło
6

Nie widziałem tego jasno wyrażonego w żadnej z poprzednich odpowiedzi. Wielu programistów nie bierze pod uwagę formalnej definicji podczas pracy z tabelami. Często komunikujemy się intuicyjnie w kategoriach „zapisów” lub „wierszy”. Jednak, z pewnymi wyjątkami dotyczącymi relacji zdenormalizowanych, tabele są zwykle projektowane tak, aby relacja między atrybutami niekluczowymi a kluczem stanowiła ustawioną funkcję teoretyczną.

Funkcję można zdefiniować jako podzbiór produktu krzyżowego między dwoma zestawami, w którym każdy element zestawu kluczy występuje najwyżej raz w odwzorowaniu. Stąd terminologia wynikająca z tej perspektywy wydaje się być pojedyncza. Widzimy tę samą konwencję w liczbie pojedynczej (lub przynajmniej w liczbie mnogiej) w innych teoriach matematycznych i obliczeniowych obejmujących funkcje (na przykład rachunek algebry i lambda).

jerseyboy
źródło