2017-06-06 15 views
0

たとえば、Companyのようなモデルを作成するときに一般的な質問(具体的にはDjango/Python)を使用すると、複数のユーザー(従業員)が関連しますそのようなモデルは、どのように異なるモデルを関連させるべきか?Django:関連モデルのユーザーモデルまたはプロファイルモデルを使用する

I.e.ユーザープロファイルは、OneToOneFieldを介してユーザーオブジェクトに関連付けられます。しかし、CompanyオブジェクトがForeignKeyによってUserオブジェクトまたはUserProfileオブジェクトに関連付けられるべきであり、なぜこれが適切な方法ですか?

ので

class UserProfile(models.Model): # For the Company Employees 
    user = models.OneToOneField(UserModel, related_name='employeeprofilemodel', on_delete=models.CASCADE, blank=True, 
    null=True) 
    ... 
    company_rel = models.ForeignKey(CompanyModel, related_name='companyrel', null=True) 

または

class User(AbstractBaseUser): # For all Users 
    ... 
    company_rel = models.ForeignKey(CompanyModel, related_name='companyrel', null=True) 

答えて

1

これはかなり専門的よりも、意見に基づく質問の詳細です。私はAUTH_USER_MODELと1対1の関係を作成している前者の方法をお勧めしたいと思います。次に、従業員に関連するデータを、UserKeyテーブルに格納することができます。これは、ForeignKey関係を通じてCompanyテーブルに関連付けることができます。この種のデータベーススキーマの利点は、本質的に機密性の高い従業員の詳細に影響を与えることなく、将来(必要な場合はもちろん)ユーザーテーブル(AUTH_USER_MODEL)を変更できることです。 Userテーブルは、データベース内のCompanyテーブルとは独立して存在し、Authorizationに使用できます。また、dbクエリ中には少ないデータしか渡されず、暗黙のうちに最適化のレベルを達成することができます。私はこれがauth.Userモデルからの拡張よりも適切な方法だと考えています。

後者の方法では、データベースのリファクタリングが必要になったときに、上記の機密データを危険にさらす可能性があります。また、ユーザモデルがユーザに関する必要以上に多くのデータを持っている場合、クエリーはずっと重くなります。ユーザー表を使用してdb照会を処理するときは、最適化のために特別な注意が必要になることがあります。

関連する問題