您将如何为这些数据库关系建模? (用户、能力、兴趣)

How would you model these database relationships? (User, Competence, Interest)

我正在使用 Django 系统,实际上事情很简单,但有一件事让我很困扰,我认为这一定是更好的方法。

基本上它是一种内部工具,用于搜索公司可用的开发人员,以便根据他们的技能和兴趣将他们分配到项目中。

假设 员工 约翰可以添加一个 主题 反应到他的能力列表和 select 他的技能水平来自1 到 5 颗星,表示 1 = 初学者,5 = 专家。他还可以 select 他的兴趣等级从 1 到 5。所以你可以有一个像下面这样的列表

DB的设计方式是这样的:

Table 具有所有相关用户信息的用户 Table knowledge_topic 列 [id, label],其中 label 只是 language/tech 的名称 Table knowledge_level with columns[id, knowledge_level, interest_level, topic_id, user_id] 其中 topic_id 与 knowledge_topic table 和 user_id 给用户 table

权限列表端点可以给出如下结果,例如:

[
    {
        "id": 2,
        "topic": {
            "id": 8,
            "label": "Docker"
        },
        "interest_level": 4,
        "knowledge_level": 2,
        "user": 2
    },
    {
        "id": 5,
        "topic": {
            "id": 9,
            "label": "Flask"
        },
        "interest_level": 1,
        "knowledge_level": 2,
        "user": 2
    },
    {
        "id": 1,
        "topic": {
            "id": 1,
            "label": "React"
        },
        "interest_level": 4,
        "knowledge_level": 4,
        "user": 2
    },
    {
        "id": 16,
        "topic": {
            "id": 3,
            "label": "SCSS"
        },
        "interest_level": 2,
        "knowledge_level": 1,
        "user": 1
    },
    {
        "id": 136,
        "topic": {
            "id": 2,
            "label": "Django"
        },
        "interest_level": 1,
        "knowledge_level": 1,
        "user": 3
    },
    {
        "id": 137,
        "topic": {
            "id": 9,
            "label": "Flask"
        },
        "interest_level": 1,
        "knowledge_level": 1,
        "user": 3
    },
    {
        "id": 138,
        "topic": {
            "id": 3,
            "label": "SCSS"
        },
        "interest_level": 1,
        "knowledge_level": 1,
        "user": 3
    }
]

如您所见,这里的“独特性”与用户+知识的结合有关。所以每次我有一个用户添加一个新的权限时,我都会在 knowledge_competence table 中添加一个额外的行,这对我来说是不必要的。

有没有更好的方法,还是我想多了?我在想也许创建一个 table interest 字段 [id, level] 和 competence 也有 [id, level] 也许两个 table 中的“标签”字段只是为了对级别的含义进行文本描述。然后我可以建立一个用户->主题->能力和用户->主题->兴趣的关系链。这样,两个 table 总是有 5 行(能力和兴趣水平),主题总是限于该公司所有员工拥有的语言范围,以及所有员工的用户。几乎没有任何数据可以添加到数据库中,只有当真的有新员工或主题时。这是一个好的设计吗?

我会为“开发人员”构建一个 table,为“技能”构建一个 table。

然后创建一个 table“dev_skill”,将开发人员与技能相关联,并提供额外数据:“兴趣”和“经验”

有一个关于如何用 django 做到这一点的例子:Django's ManyToMany Relationship with Additional Fields