簡體   English   中英

django 應用程序的數據庫設計

[英]Database design for django application

我有一個問題讓它更容易:我有一個像user -> Hotel - > Rooms這樣的關系。 用戶可以創建酒店,然后每個酒店可以有很多房間。

現在我有一個像

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    company_name=models.CharField(max_length=50, null=False, blank=False)
    email=models.CharField(max_length=50, null=False, blank=False)
    company_number=models.CharField(max_length=50, null=False, blank=False)

並創建餐廳

class Restaurant(models.Model):
    rest_owner = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name='rest_owner')
    name = models.CharField(max_length=50, null=False, blank=False)
    address = models.TextField(max_length=100, null=False)
    city = models.CharField(null=True, max_length=50)
    country = models.CharField(null=True, max_length=30)

現在房間

class Room(models.Model):
    rest_owner = models.ForeignKey(Restaurant, on_delete=models.CASCADE, related_name='rest_owner')
    name = models.IntegerField()
    Rooms = models.IntegerField()

這是做到這一點的好方法嗎? 並保存房間和餐廳的圖像 我應該制作一個

class Image(models.Model):
    image = models.ImageField(null=False, upload_to='Gallery')

然后在房間和餐廳使用images = models.ManyToManyField(Image) . 我需要知道做這兩個的最佳方法。 謝謝

你的大部分設計都很好,但是,有一些小問題:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    company_name=models.CharField(max_length=50, null=False, blank=False)
    email=models.CharField(max_length=50, null=False, blank=False)
    company_number=models.CharField(max_length=50, null=False, blank=False)
  1. User 模型已經有一個 email 字段,所以這里不需要一個。
  2. null=False, blank=False是默認值,應該刪除。
  3. 如果company_namecompany_number相關,那么您應該通過使它們成為Company模型的外鍵來制作此第二范式
    class Company(models.Model):
        name = models.CharField(max_length=50)
        number = models.CharField(max_length=50)

    class UserProfile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        company = models.ForeignKey(Company)

對於Restaurant模型:

class Restaurant(models.Model):
    rest_owner = models.ForeignKey(UserProfile, 
                                   on_delete=models.CASCADE, 
                                   related_name='rest_owner')
    name = models.CharField(max_length=50)
    address = models.TextField(max_length=100)
    city = models.CharField(null=True, max_length=50)
    country = models.CharField(null=True, max_length=30)
  1. rest_owner外鍵表示一個用戶可以擁有多個Restaurants ,而on_delete=CASCADE表示如果您刪除一個UserUserProfile ,那么所有關聯的Restaurants也應該被刪除。 你確定這是你想要的嗎?
  2. related_name使得它,所以你可以說my_user.rest_owner.all()來獲取所有用戶,這不正是流動舌擁有的餐館。 最好使用您所在的類名的復數形式,即my_user.restaurants.all() related_name="restaurants"將為您提供my_user.restaurants.all()
  3. TextFields的長度小於CharField的最大長度是沒有意義的。
  4. 我會讓國家成為一個兩個字符的字段,並用國家的 ISO 3166-1 alpha-2 代碼填充它。

對於Room模型:

class Room(models.Model):
    rest_owner = models.ForeignKey(Restaurant, 
                                   on_delete=models.CASCADE, 
                                   related_name='rest_owner')
    name = models.IntegerField()
    Rooms = models.IntegerField()

我不確定您想對nameRooms字段做什么,所以我將跳過這些。 對於Restaurant的外鍵:

  1. 用它指向的模型的名稱來命名外鍵字段是一個很好的做法,即
    class Room(models.Model):
        restaurant = models.ForeignKey(Restaurant, ...)

這允許您說例如: my_room.restaurant.city

  1. 與上面類似,相關名稱應該是您所在模型的復數形式,因此
    class Room(models.Model):
        restaurant = models.ForeignKey(Restaurant, related_name='rooms', ...)

這給了你my_restaurant.rooms.all() ,這比my_restaurant.rest_owner.all()讀起來要好得多——這很難猜到返回的房間......

對於您需要考慮的圖像:

  1. 可以在房間之間共享圖像嗎(是 => 多對多,否 => 外鍵)
  2. 如果圖像被編輯,所有使用圖像的房間都應該立即獲得更改(是 => ManyToMany,否 => ForeignKey)。

不過,一個很好的經驗法則是 - 如果您有疑問,可以使用外鍵 ;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM