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

Posted

技术标签:

【中文标题】您将如何对这些数据库关系建模? (用户、能力、兴趣)【英文标题】:How would you model these database relationships? (User, Competence, Interest) 【发布时间】:2021-04-29 06:07:34 【问题描述】:

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

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

假设 员工 John 可以在他的能力列表中添加一个 Topic React 并从 1 到 5 星选择他的技能水平,这意味着 1 = 初学者和 5 =专家。他还可以从 1 到 5 选择他的兴趣级别。所以你可以有一个如下列表

DB 的设计方式是这样的:

包含所有相关用户信息的表用户 表 Knowledge_topic 与列 [id, label],其中 label 只是语言/技术的名称 表 Knowledge_level 与列 [id, knowledge_level, interest_level, topic_id, user_id] 其中 topic_id 与 Knowledge_topic 表和 user_id 与用户表建立关系

能力列表端点可以给出这样的结果,例如:

[
    
        "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 表中添加一个额外的行,这对我来说是不必要的。

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

【问题讨论】:

【参考方案1】:

我会为“开发人员”建立一个表格,为“技能”建立一个表格。

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

有一个关于如何使用 django 执行此操作的示例:Django's ManyToMany Relationship with Additional Fields

【讨论】:

以上是关于您将如何对这些数据库关系建模? (用户、能力、兴趣)的主要内容,如果未能解决你的问题,请参考以下文章

您将如何为 MegaProtoUser 实现自我关系?

UML

在关系数据库中对相同实体之间的多个多对多关系进行建模

PSO(Thepopularity-similarity-oplimization) modol

推荐系统之用户兴趣建模-DIEN论文解读

01需求工程软件建模与分析阅读笔记之一