web-dev-qa-db-ja.com

データベースの設計:4種類のユーザーが、異なる機能を持っていますが、個別ですか、それとも1つのテーブルですか?

私には4種類のユーザーがいます:

Adminsnormal usercompanyservice provider

管理者と通常のユーザーはいくつかの属性(id .first name ,last name ,phone ,mail)会社とサービスプロバイダーもいくつかの属性を共有しています(id .company name ,phone ,fax ,mail)。

アプリケーションの他のエンティティとも相互作用して、ポストジョブやイベントなどの機能にアクセスしたり、申請したりします

それらすべてをtbl_usersのような1つのユーザーテーブルに置く方が良いですか、それとも、それぞれに個別のテーブルを作成する方が良いですか?または、(管理者と通常のユーザー)と(会社とサービスプロバイダー)の2つのテーブルに追加します。

3
ramyMorad

あなたが行くことができるシンプルなデザインは3つのテーブルを選択することです

テーブルMasterUser

UserId - PK - Identity(auto increment) 
phone
mail

テーブルAdminNormalUser

UserId -- Pk of this table and UserId of `MasterUser`
FirstName
LastName

テーブルCompanyPorviderUser

UserId -- Pk of this table and UserId of `MasterUser`
CompanyName
Fax 

このデザインは、管理者、通常、会社、プロバイダーのユーザーに関係なく、各ユーザーに一意のIDを提供します。これは、これらのテーブルを使用するアプリケーションの要件であり、NULLを使用して列を削除します値。

2
vijayp

個別のテーブルを保持している場合、両方のタイプのユーザーが同じデータを操作していると、参照整合性の問題が発生する可能性がありますが、ユーザーテーブルに不要なnullを入れたくないので、一般的でないユーザー用に個別のユーザー属性テーブルを作成することをお勧めします属性

したがって、1)tbl_userには、ユーザーのタイプを指定するフラグ付きのすべての一般的な列が含まれています2)tbl_AdminAttributeには、関連するUserID +追加ファイルが含まれています3)tbl_CompanyAttributeには、関連するUserID +追加ファイルが含まれています4)tbl_ServiceProviderAttributeには、関連するUserID +追加ファイルが含まれています

理にかなっていると思います

1
mouliin

データベースサーバーの負荷が高くなる可能性がある大量の結合を使用しないようにするには、各ユーザーを個別のテーブルに個別に格納します。

このタイプの構造で直面する可能性がある唯一の問題は、アプリケーションの進化です。ある時点で、特定の2種類のユーザー(つまり、管理ユーザーと通常のユーザー)に関する追加の情報を保存したい場合があります。これが発生した場合、データベースとアプリケーションの両方を変更する必要のある場所がいくつかあり、これは人為的なミスが発生しやすくなります。

この種の問題が心配な場合は、親子関係を使用するか、データベースに継承を実装することを検討してください。

実装することを選択した場合、このタイプの構造のいくつかの手法を以下に示します。 https://stackoverflow.com/questions/386652/techniques-for-database-inheritance

1
getmid