python - 数据库设计通讯录

标签 python mysql django

我正在尝试为地址簿开发 mysql 模式。我不确定的是如何对其进行建模,因为有些联系人将有一个电话号码和一个电子邮件地址,而其他联系人可能有多个电话号码和一个电子邮件地址。在前端,我将创建一个按钮,允许用户添加地址字段。

现在我的模型看起来像这样:

class Person(models.Model):
    sex = models.CharField(max_length=32)
    first_names = models.CharField(max_length=64)
    last_names = models.CharField(max_length=64)
    date_of_birth = models.DateField()
    marital_status = models.CharField(max_length=64)
    nationality = models.CharField(max_length=64)

    address_street = models.CharField(max_length=64)
    address_alt_line = models.CharField(max_length=64)
    address_zip = models.CharField(max_length=64)
    address_state = models.CharField(max_length=64)
    address_city = models.CharField(max_length=64)
    address_country = models.CharField(max_length=64)
    phone1 = models.CharField(max_length=64)
    phone2 = models.CharField(max_length=64)
    phone3 = models.CharField(max_length=64)
    phone4 = models.CharField(max_length=64)
    phone5 = models.CharField(max_length=64)
    email1 = models.CharField(max_length=64)
    email2 = models.CharField(max_length=64)
    email3 = models.CharField(max_length=64)
    email4 = models.CharField(max_length=64)
    email5 = models.CharField(max_length=64)
    website1 = models.CharField(max_length=64)
    website2 = models.CharField(max_length=64)
    website3 = models.CharField(max_length=64)
    website4 = models.CharField(max_length=64)
    website5 = models.CharField(max_length=64)
    website6 = models.CharField(max_length=64)
    website7 = models.CharField(max_length=64)
    website8 = models.CharField(max_length=64)
    website9 = models.CharField(max_length=64)

但是我知道这不是很干燥。我想到的另一个选择是为人员创建单独的模型,为地址、电子邮件、电话号码、网站等创建单独的模型,然后将 person.id 作为这些模型的外键:

class Person(models.Model):
    sex = models.CharField(max_length=32)
    first_names = models.CharField(max_length=64)
    last_names = models.CharField(max_length=64)
    date_of_birth = models.DateField()
    marital_status = models.CharField(max_length=64)
    nationality = models.CharField(max_length=64)


class Address(models.Model):
    street = models.CharField(max_length=64)
    alt_line = models.CharField(max_length=64)
    zip = models.CharField(max_length=64)
    state = models.CharField(max_length=64)
    city = models.CharField(max_length=64)
    country = models.CharField(max_length=64)
    type = models.CharField(max_length=64)
    owner = models.ForeignKey(Person, on_delete=models.CASCADE)


class Phone(models.Model):
    number = models.CharField(max_length=64)
    type = models.CharField(max_length=32)
    owner = models.ForeignKey(Person, on_delete=models.CASCADE)


class OnlineContact(models.Model):
    address = models.CharField(max_length=64)
    type = models.CharField(max_length=32)
    owner = models.ForeignKey(Person, on_delete=models.CASCADE)

这些方法是否好(足够)或者是否有更好的方法?我宁愿不使用 NOSQL 数据库而坚持使用 MySQL。仅供引用,我使用 Python 和 Django。

类 Person(models.Model):

最佳答案

我不认为 DRY 与模型设计相关,除非你使用相同的模型并覆盖它几次

如果将其拆分为 2 个模型,例如: 用户,用户详细信息 因此将身份验证数据和个人数据分开是合乎逻辑的 但在你的情况下,它在表上有很大的分离

为什么您需要这么多表格用于电话、网站、电子邮件 也许你的数据设计不正确

关于python - 数据库设计通讯录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40978518/

相关文章:

python - 在Python中将矩阵转换为图像

python - "scipy.sparse.issparse"是如何工作的?它总是返回 "False"

python - 为在 Django 之上编写的谷歌云端点 API 编写测试用例

python - 128x512 数组列表中的图像列表可提高效率

mysql - 如果一年内没有发生销售,则缺少行

mysql - 循环运行多个Sql命令

python - 使用 django 过滤器搜索多个单词时该怎么办

python - 尝试在 Python/Django 中清理非常基本的 MySQL SELECT

mysql - 从 csv 导入 SQL

python - 将 django cms 页面渲染为 json