我正在尝试决定如何存储一些地址信息。这就是我的想法(它是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类中呢?但后来我再也无法从邮政编码中查找这座城市了。
那么也许我应该在两个模型中都有城市?但现在我有了重复。这仍然是最好的选择吗?
答案 0 :(得分:3)
不是真的。你混合了两个不同的功能方面。
规范化您的数据,以便不会重复。否则你的数据库就会瘫痪。
安全。为什么在地球上你会允许任何人更新Reference(构成地址的构成静态数据的表)表?应该为管理员用户保留。并且您需要定期更新当地议会或其他任何参考表。
答案 1 :(得分:1)
恕我直言,你可以保留设计。
如果您的城市不正确,您的用户将对其进行更新。如果您认为用户也可能出错,只需等待X人使用第一个用户提供的相同信息更新您的数据,然后相应地更新您的数据库。
答案 2 :(得分:1)
我保留了设计,只是在(postal_code,city)和(city,province)上设置了唯一约束。这样,如果相同的条目溢出到另一个区域,它们可以出现两次。