Database design 存储街道地址和邮政编码

Database design 存储街道地址和邮政编码,database-design,Database Design,我正在尝试决定如何存储一些地址信息。这就是我的想法(它是Django模型的形式,但您应该能够阅读它) 我已经有了一个包含城市、省份、国家和邮政编码的数据库。在大多数情况下,用户将只输入地址 这样,如果用户输入邮政编码,我就可以为他自动填充城市、省和国家字段。但如果我的数据过时或不正确怎么办?然后用户只需使用正确的信息更新这些字段,然后我就可以相应地更新我的数据库 但是如果他输入了其他人的邮政编码,然后将城市更新为不正确的信息,会发生什么呢?他刚刚弄坏了别人的地址 也许我应该把city字段移到Ad

我正在尝试决定如何存储一些地址信息。这就是我的想法(它是Django模型的形式,但您应该能够阅读它)

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

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

但是如果他输入了其他人的邮政编码,然后将城市更新为不正确的信息,会发生什么呢?他刚刚弄坏了别人的地址

也许我应该把city字段移到Address类?但是我再也不能从邮政编码上查到这个城市了


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

我想你可以保留这个设计


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

我想您可以保留该设计


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

我保留了设计,只是对(邮政编码,城市)和(城市,省)进行了唯一约束。这样,如果相同的条目溢出到另一个地区,它们可能会出现两次。

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

不太可能。你混淆了两个不同的功能方面

  • 使数据正常化,以避免重复。否则,您的数据库将被破坏

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


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

  • 使数据正常化,以避免重复。否则,您的数据库将被破坏

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


  • 当城市跨越州际线,邮政编码跨越城市或州际线(在美国肯定是这样的)时,你会怎么办?@HLGEM:不知道他们会。。。这可能有问题。你能举个例子说明这种情况在哪里发生吗?这意味着我需要在Address.Nvm中存储城市和州。你知道吗?这实际上不是一个问题。同一个城市,不同的州,我会有两个条目。交叉的邮政编码。。我希望“代码”是唯一的……但如果我真的必须这样做,我可以让(代码,城市)在一起成为唯一的。邮政编码81601包含加的夫、格伦伍德、格伦伍德斯普林斯、西格伦伍德公司。这种情况经常发生(我对邮政编码表的数据库查询返回了超过100000条记录)特别是在人口较少的地区。当城市跨越州际线和邮政编码跨越城市或州际线时(在美国肯定是这样的)?@HLGEM:我不知道他们会。。。这可能有问题。你能举个例子说明这种情况在哪里发生吗?这意味着我需要在Address.Nvm中存储城市和州。你知道吗?这实际上不是一个问题。同一个城市,不同的州,我会有两个条目。交叉的邮政编码。。我希望“代码”是唯一的……但如果我真的必须这样做,我可以让(代码,城市)在一起成为唯一的。邮政编码81601包含加的夫、格伦伍德、格伦伍德斯普林斯、西格伦伍德公司。这经常发生(我对我们的邮政编码表的数据库查询返回了超过100000条记录),特别是在人口较少的地区。嗯?(1) 怎么做?按照我指定的方式,没有重复,但这正是导致问题的原因。(2) 你不会的。这是另一个问题。如何处理不正确的数据?您是否允许用户更新它?他是否必须提交bug并等待管理员修复?什么?马克。从什么时候起,不重复会导致“问题”???(在两个州中输入的跨越州边界的城市不是重复的)。2) 好吧,如果你的管理员只在星期五工作,当然,提交一个数据输入请求或其他什么。我提请您注意以下事实:所示的5个表与合理的“地址”列组之间存在较大差距;允许任何人而非合格人员更改数据库中的参考值;你没有从参考机构处加载缺口。看看哪个是从议会数据加载的;用户不输入郊区、街道名称或邮政编码,而是从下拉列表中选择;无需等待管理员;不允许用户更新引用数据。@标记。我没有附件。你可以选择你喜欢的任何型号。但请至少从当局那里载入郊区和街道名称;并排除da的可能性
    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)