2013-12-10 113 views
0

我想知道我應該如何爲我的城鎮,縣,省設計數據庫。數據庫設計 - 單位或多元

我有2個想法應該如何工作。

思想1 - 簡單:

每個這些類型的應被存儲爲單獨的表。

class Town(models.Model): 
    name = models.CharField(max_length=128) 
    slug = models.SlugField() 
    voivodeship = models.ForeignKey("Voivodeship", null=True, blank=True) 
    county = models.ForeignKey("County", null=True, blank=True) 
    town_type = models.ForeignKey("TownType", null=True, blank=True) 
    population = models.PositiveIntegerField(null=True, blank=True) 
    latitude = models.FloatField(null=True, blank=True) 
    longitude = models.FloatField(null=True, blank=True) 


class County(models.Model): 
    name = models.CharField(max_length=128) 
    voivodship = models.ForeignKey("Voivodeship", null=True, blank=True) 
    type = models.CharField(max_length=64) 


class Voivodeship(models.Model): 
    name = models.CharField(max_length=128, blank=False, null=True) 
    slug = models.SlugField(editable=False) 
    date_updated = models.DateField(null=True, blank=False) 
    shortcut = models.CharField(max_length=16) 

理念2 - 更加複雜:

的想法是創建所有的地方1個表,並創建它們之間的內在聯繫。

class Location(MPTTModel): 
    name = models.CharField(max_length=256, null=True, blank=False) 
    slug = models.SlugField(editable=False) 
    shortcut = models.CharField(max_length=16, null=True, blank=True) 

    date_added = models.DateTimeField(auto_now_add=True) 
    date_updated = models.DateTimeField(auto_now=True) 
    source = models.PositiveIntegerField(choices=SOURCE_CHOICES) 

    # Geonames metadata 
    geoname_id = models.CharField(max_length=256, null=True, blank=False) 
    alternatenames = models.TextField() 
    feature_class = models.CharField(max_length=2, null=True, blank=True) 

    # Teryt metadata 

    # first_order_division = models.ForeignKey("self", null=True, blank=True, verbose_name="Województwo") 
    # second_order_division = models.ForeignKey("self", null=True, blank=True, verbose_name="Powiat") 
    # third_order_division = models.ForeignKey("self", null=True, blank=True, verbose_name="miasto") 
    # fourth_order_division = models.ForeignKey("self", null=True, blank=True) 

    type = models.PositiveIntegerField(choices=LOCATION_TYPE_CHOICES, null=True, blank=False) 
    subtype = models.ForeignKey("self") 

    # Location metadata 
    lng = models.FloatField(null=True, blank=True) 
    lat = models.FloatField(null=True, blank=True) 
    population = models.PositiveIntegerField(null=True, blank=True) 
    country_code = models.CharField(max_length=2, null=True, blank=True) 

在可靠性,速度,添加和更新記錄方面,哪一個長期運行效果最好?

我應該注意什麼?

+0

沒有關於你想要達到什麼的更多信息,我會選擇第二個選項。 – yuvi

+0

你想要做什麼? 「內部關係」是什麼意思? –

+0

@SamD內部關係 - 'subtype = models.ForeignKey(「self」)' – miki725

回答

0

我使用了上述的平面設計。它比表分隔有許多優點,例如在url模式中 - 維護它們更容易,因爲您可以將所有位置放在1個模式中,並且不必執行額外的查看查詢。

使用django-mptt構建結構非常容易,因此您可以使用平面數據庫設計更快地解決原型解決方案。以這種方式生成結構和麪包屑非常容易。

0

這一切都取決於你想要做什麼,但我認爲這將是更好的使用多個表。將所有內容放在一張表中可以使您的業務邏輯變得相當複雜。下面是一些例子:

  • 如果Location的類型爲foo,那麼它的__str__應該返回一兩件事,爲bar類型應該返回別的東西。基本上,你可以在Location方法中得到一大堆if聲明,我認爲這些方法不是很乾淨。
  • 針對不同位置類型製作模型表單變得令人頭疼。
  • 代碼可能會變得更難以維護,或者數據庫遷移可能會在以後出現。

同時在一張表中放入所有東西都不會增加任何性能優點,因爲它仍然有一個外鍵,所以表連接仍然必須執行。

+0

我注意到geonmaes db使用這種設計。 http://www.geonames.org/ – Efrin

+0

它有一個平面或多表架構? – miki725

+0

它使用平面設計 – Efrin