複数のテーブル名と特異なテーブル名


41

新しいデータベースを作成するとき、どのようにテーブルに名前を付ける必要がありますか?

単数形:Clientまたは複数形:Clients


テーブル名は単数形で、ビュー名は複数形であると主張する同僚がいました。
ルネニフェネガー

1
他の考え方もあります。1)クエリを自然言語で表現できるようにする動詞を使用person NAMED 'fred' EARNS 20,000します(例:大文字の名前はテーブルです)。2)セットのために、例えば企業の名前を使用しPERSONNELPAYROLLORG_CHARTなど、
onedaywhen

回答:


44

あなた次第。ただ一貫してください。

個人的には、各* row "が格納するものに基づいて、注文、製品、ユーザー、アイテムなどの単数形を好む

これは、単一のエンティティ/タイプを使用するモデリング(オブジェクトロールモデリングによる)と一致します。

編集:

1つの理由は、リンクテーブルがあるときに複数形が失敗することです:
Orders、またはProductsを与える。どちらも聞こえないOrderProductsOrdersProducts

または履歴テーブル(もちろん、このためにスキーマを使用できます):
Orders-> OrdersHistoryまたは(いいえ!)OrdersHistoriesOrder-> OrderHistory良くなりませんか?


2
それは常に個人的な選択に要約されるべきですか?1人のデータベース設計で2人が作業している場合、1人はテーブルを複数と命名し、もう1人はテーブルを単一と命名します。またはを使用する理由に関する正当な理由はありませんSingularPlural
ジョンイザヤカルモナ

2
@JohnIsaiahCarmona:理由を追加
gbn

3
単数形を最も賢明なものとして使用することに同意します。ここやSOなどで似たような質問を見てみると、これは一般的な意見ではないようです。ORMがこの(悪い)習慣の人々を破壊し始めているのではないかと思います。テーブルに複数の名前があると、親と子のナビゲーションプロパティを区別したり、テーブルのインスタンスオブジェクトとコレクションオブジェクトを区別したりするのが難しくなります。
ジョエルブラウン

4
Singularを支持するもう1つの理由は、TablenameIDor TablenameCodeやor など、PKの名前がtablenameに基づいているというルールがある場合ですtablename_id。複数のテーブル名を使用すると、テーブル名に複数形を使用するOrders.OrdersID(正しく見えない)かOrders.OrderID、列プレフィックスを単数形に変更することになります。
ypercubeᵀᴹ


8

単数のテーブル名と複数のテーブル名に関して、主題は議論の余地があるようですが、そうすべきではありません。

テーブルは複数のレコードのコレクションですが、テーブルには含まれる1つのタイプのレコードの定義に基づいて名前が付けられます。テーブルに含まれるレコードのタイプとは異なる名前を使用できる場合、テーブルに複数の名前を付けることができます。これにより、たとえば、複数のEmployeeレコードを含むEmployeesテーブルを作成できます。しかし、SQLの設計者は、テーブルとレコードタイプに別々の名前を提供しませんでした。

データを使用するオブジェクト指向プログラムでは、1つのレコードを記述するために使用するクラスの名前と一致するため、レコードタイプの名前(および拡張によりテーブル名)が単数のままである場合、物事はより論理的に機能します。

その後、プログラムでコレクションを識別したい場合は、複数を使用するか、EmployeeListやEmployeeArrayなどの適切な修飾子を使用することをお勧めします。

また、自動コード生成のための不規則な複数形や、プログラム内で複数形の形成について異なる言語の背景やアイデアを持っているプログラマーにも問題があります。

英語は適切で適切なプログラミング言語ではありません。データベースとプログラムのステートメントを英語に準拠させようとするのは、これらのステートメントの1つを読む方が良いと思われるためです。


5

@gbnの答えと同じように、これは好みの問題だと思うので、彼と同じように、あなたが行った選択はどこにでも(少なくともそのDBでは)適用することをお勧めします。一貫性には価値があります。

私の好みは、しかし、複数形はSELECT声明でより良いことです:

SELECT Id, Name, Status 
FROM   Persons
WHERE  Status <> 5  --5 meaning deleted

この場合、少なくとも、テーブルには複数の人がおり、そのうちのいくつかはクライアントに返されます。


2
技術的にはPersonの複数形はPeopleであり、これが私が単数形を使用する1つの理由です。一部のORMは自動的にテーブルを作成しますが、言語的に命名が論理的ではないこのような奇妙なシナリオが発生します。
-Mr.Brownstone

5

「注文」は予約語です。「注文」は

「ユーザー」は予約語です。「ユーザー」は

「セッション」は予約語です。「セッション」は

「結果」は予約語です。「結果」は

「相対」は予約語です。「相対」は

...

これらは、基幹業務データベースに含まれる一般的な単語のように見えます。複数の単語は、単数の単語よりもキーワードとして一般的ではないようです。したがって、SQLキーワードとの競合を避けるために、複数のテーブル名を使用することが有益な場合があります。


1
これは明確にするためには近すぎます。単数形または複数形の予約語は避けてください。これは、複数の予約語を同じ意味で使用するエラーメッセージをデバッグするときに非常に役立ちます。理想的には、アプリケーションのドメインから単語を選択して、使用/ユーザーにより関連するようにします。
Emacsユーザー

「わかりやすくするには近すぎます」とはどういう意味ですか?
ニールマクギガン

1
エラーメッセージを解読するオーバーヘッドが不必要に高くなることを意味します。たとえば、構文エラーメッセージの順序と順序。または、認証エラーメッセージでユーザーとユーザーをデバッグしようとしています。
Emacsユーザー

IMO発注書、PortalUser、UserSession、より良いだけの注文よりもユーザーである、セッションので、単数形かもしれないが、ちょうどこのシナリオで罰金を行う
ジョンジャイ

1

SQLテーブルには複数の名前が必要だと思います。読みやすくなります。

本の記録の表は本と呼ばれるべきです。ORMは同じ規則を使用する必要があります。Booksオブジェクトはコレクションであり、Booksテーブルのすべてのレコードを管理します。Bookオブジェクトは、単一のレコードを管理します。

これにより、コーディングがより自然になります。

select name, publication_date from books where publication_date > '2000-01-01';

books = Books()
for book in books.get("publication_date >= '2000-01-01'"):
    print book.name

あなたがseep.getで羊のために書かなければならないまで理にかなっています...ルールを曲げ、柔軟に。
Emacsユーザー

確かに、いくつかのコンテナは名詞のような複数形ではない単語-「アクセス」のような単語です。ただし、「access_record in access」を使用して変更できます。
dlink

しかし、リンクオブジェクトが表示されるのは少し厄介です。書籍と著者間のリンクテーブルはどうですか?「BooksAuthors」は見た目も音もひどいですが、「BookAuthor」は見た目も音も良くなります。次に、複数形(ステータス)または奇数名詞(子vs子)の奇数の語尾を持つ単語に入ります。IMOは目の痛みの世界です!
Blobbles

こんにちは、@ blobblesは複数形がBooksAuthorsではなくBookAuthorsになります。そのため、まだ自然に読み取れます。などBookPublishers、BookFormats、
DLINK

読みやすさは常に優れていますが、それは文に関するものではなく、データを取得する場所に関するものです。たとえばtable.fieldauthor.authorNameまったく問題ありません。authorテーブルからauthorNameを取得します。著者が1人だけの場合、複数形も見た目が悪くなります。authors.authorName著者が1人だけの場合 それはもっとわかりにくいものです。もちろん、これは文スタイルmysql_を廃止し、データにアクセスするためのより良い方法を持っているので、はるかに良くなりました:)
James

1

プログラミングで数年間働いた後、私は複数化は不必要な複雑さであると結論付けました。私の意見では、KISSの哲学によれば、プログラマーは時間と効率の理由から、すべての問題に対して最も遅延が少なく簡単な解決策を模索するべきだと思います。したがって、すべてのシナリオで単数形は必要な作業が少なくなります。


この答えは、スレッド全体に実際には何も追加しません!たとえば、テーブルを「注文」と呼ぶことで問題に答えることができません!個人的には、英語がうまくいかないときはフランス語を使います-ordre、groupe ... 常にあなたの選択を説明するためにテーブルのコメントフィールドを使用してください!しかし、本当に重要なことは、慣習を持ち、それに固執することです!
ベレース

どのように追加しないのですか?私の意見では、単数形は作業が少ないと付け加えました。私とは異なる意見をお持ちの場合は、私の意見を軽視しないでください。「順序」は問題ではありません。問題はより複雑な複数形であり、「カテゴリ」などの不必要な作業を引き起こすあらゆる組み合わせのスペルミスを見たことがありません。
ColacX

0

それは非常に個人的なものです。私は30年間、単数形を使用しています。しかし、なぜ人々が複数形を好むのかは理解できます。本-私は本の著者が間違っていないと思うので著者は興味深いです。本には1人以上の著者を含めることができます。また、著者は1冊以上の本を執筆している場合があります(共著など)。また、複数の著者が書いた本をどのように扱うかにも依存します。私は他の答えに同意します。いずれかを選択して、一貫性を保ってください。予約語の問題に関して。回避策の名前を思いつくのは難しくないと思います。ユーザー-> app_user、セッション-> app_session、注文-> customer_order


0

私たちは物事を異なる視点から見ていますが、2つのキャンプは次のように識別されていると思います。

単数形(「ユーザー」)
テーブル名と、それが複数の行を含むことができるコンテナを表すという事実との間に相関関係を作る人。

そのため、「ユーザーコンテナ」には複数の行を含めることができます。

複数(「ユーザー」)
テーブル名と、それがコンテナを表すという事実との間に相関関係を持たない人。もちろん、彼らはそれがコンテナであることを知っていますが、名前にはありません。

たとえば
、「卵のカートン」には複数の卵を入れることができますが、コンテナーの参照が名前に含まれているため、複数の卵の可能性があります。ただし、単一のテーブル名「user」では、コンテナ参照は名前に含まれません。例えば、「user_container」は、複数の名前を好む人にはおそらく受け入れられるでしょう。

これは、長年にわたる複数の慣習が一般的な慣習であり、ほとんどのオンライン教材にもあると思います。


これはすべて、技術的に言えば、単一のコンテナに名前を付けており、コンテナには複数の(または単一の)行を含めることができるため、単数形はより正確だと思います。
名前付きのコンテナをコンテンツに精神的にリンクするのではなく、複数の行が複数の名前を必要とするため、人々はテーブル名をコンテンツに精神的にリンクするため、人々には間違っているようです。

いつものように、多くの場合、善悪は存在せず、シナリオに適したものであり、重要なことは選択したものと一貫性があるということです。

あなたがプロジェクトを単独で行っており、あなたが最高だと思うものを何でもするか、単に好みをするかのどちらかの道を行く本当の理由がない場合。開発チームにいるときに同じことを適用し、全員一致の決定を下してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.