存储街道地址和邮政编码

时间:2011-01-31 06:05:09

标签: database-design

我正在尝试决定如何存储一些地址信息。这就是我的想法(它是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)

我已经有一个包含城市,省份,国家和邮政编码的数据库。在大多数情况下,用户只会输入地址。

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

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

那么也许我应该将city字段移到Address类中呢?但后来我再也无法从邮政编码中查找这座城市了。

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

3 个答案:

答案 0 :(得分:3)

不是真的。你混合了两个不同的功能方面。

  1. 规范化您的数据,以便不会重复。否则你的数据库就会瘫痪。

    • 当然,你必须允许跨越州界的城市,拥有两个pst代码的城镇等。
  2. 安全。为什么在地球上你会允许任何人更新Reference(构成地址的构成静态数据的表)表?应该为管理员用户保留。并且您需要定期更新当地议会或其他任何参考表。

答案 1 :(得分:1)

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

如果您的城市不正确,您的用户将对其进行更新。如果您认为用户也可能出错,只需等待X人使用第一个用户提供的相同信息更新您的数据,然后相应地更新您的数据库。

答案 2 :(得分:1)

我保留了设计,只是在(postal_code,city)和(city,province)上设置了唯一约束。这样,如果相同的条目溢出到另一个区域,它们可以出现两次。