2011-01-31 100 views
1

我试图决定如何存储一些地址信息。这就是我的想法(这是在Django模型的形式,但你应该能够阅读它)存储街道地址和邮政编码

class City(models.Model): 
    name = models.CharField(max_length=100) 
    province = models.ForeignKey(Province) 
    data_source = models.PositiveIntegerField(default=DataSources.USER) 
    latitude = models.DecimalField(max_digits=18, decimal_places=12, null=True, blank=True) 
    longitude = models.DecimalField(max_digits=18, decimal_places=12, null=True, blank=True) 
    feature_class = models.CharField(max_length=1, null=True, blank=True) 
    feature_code = models.CharField(max_length=10, null=True, blank=True) 
    population = models.BigIntegerField(null=True, blank=True) 
    elevation = models.PositiveIntegerField(null=True, blank=True) 
    time_zone = models.CharField(max_length=40, null=True, blank=True) 
    mod_date = models.DateTimeField(auto_now=True, auto_now_add=True) 

class Province(models.Model): 
    code = models.CharField(max_length=2, primary_key=True) 
    name = models.CharField(max_length=100) 
    country = models.ForeignKey(Country) 

class Country(models.Model): 
    code = models.CharField(max_length=2, primary_key=True) 
    name = models.CharField(max_length=100) 

class Address(models.Model): 
    name = models.CharField(max_length=100) 
    street = models.CharField(max_length=200) 
    postal_code = models.ForeignKey(PostalCode) 

class PostalCode(models.Model): 
    code = models.CharField(max_length=10) 
    city = models.ForeignKey(City) 
    data_source = models.PositiveIntegerField(default=DataSources.USER) 
    latitude = models.DecimalField(max_digits=18, decimal_places=12, null=True, blank=True) 
    longitude = models.DecimalField(max_digits=18, decimal_places=12, null=True, blank=True) 

我已经有了一个完整的市,省,国家,邮政编码数据库。大部分用户只会输入地址。

这样,如果用户输入邮政编码,我可以为他自动填充城市,省份和国家/地区字段。但是如果我的数据过时或者不正确呢?然后,用户只需用正确的信息更新这些字段,然后我就可以相应地更新我的数据库。

但是,如果他输入其他人的邮政编码,然后更新城市到一些不正确的地方会发生什么?他只是打破了别人的地址。

所以,也许我应该将城市领域转移到地址类呢?但是,我不能再从邮政编码中查找城市。

那么,也许我应该只有两个模型中的城市?但现在我有重复。这仍然是最好的选择?

+1

当城市跨越州或者邮政编码跨越城市或州(他们当然在美国)时,你会怎么做? – HLGEM 2011-01-31 19:00:14

+0

@HLGEM:不知道他们这么做......那可能是有问题的。你能举个例子说明发生了什么?这意味着我需要在地址中存储城市和州。 – mpen 2011-02-01 02:43:08

回答

1

恕我直言,你可以保持设计。

如果你的城市不正确,你的用户会更新它。如果您认为用户也可能错了,只需等待X人使用第一位用户提供的相同信息更新您的数据,然后相应地更新您的数据库。

1

我正在保留设计,并在(邮政编码,城市)和(城市,省)上设置唯一的约束。这样,如果相同的条目泄漏到另一个区域,它可能会出现两次。

3

不是。你正在混合两个不同的功能方面。

  1. 标准化您的数据以避免重复。否则你的数据库就会瘫痪。

    • 当然,你要允许跨州界的城市,具有两个PST码镇等
  2. 安全。为什么你会允许任何人更新引用(组成地址的静态数据表)?这应该保留给管理员用户。并且需要定期更新您当地议会的参考表格或其他内容。

相关问题