Database design 数据库设计:同一类型项的多个

Database design 数据库设计:同一类型项的多个,database-design,Database Design,我完全不知道这个问题该怎么说,所以我会解释我的想法。我以前有过设计数据库的经验,但实际上我还没有决定如何实现或运行它。我会解释一下我的想法,以此表明我已经想好了 我正在创建一个数据库来存储用户的信息,比如简历(这是一群大学生的附带项目)。我遇到的问题是如何处理存储大量的东西,比如技术技能,每个用户的熟练程度可能达到20+左右 想法一:一个巨大的表,列为TechSkill1->20。以及他们的熟练程度。使用用户ID作为FK来关联所有这些。 优点:最容易实现,最容易在前端。 缺点:限制在20个技能内

我完全不知道这个问题该怎么说,所以我会解释我的想法。我以前有过设计数据库的经验,但实际上我还没有决定如何实现或运行它。我会解释一下我的想法,以此表明我已经想好了

我正在创建一个数据库来存储用户的信息,比如简历(这是一群大学生的附带项目)。我遇到的问题是如何处理存储大量的东西,比如技术技能,每个用户的熟练程度可能达到20+左右

想法一:一个巨大的表,列为TechSkill1->20。以及他们的熟练程度。使用用户ID作为FK来关联所有这些。 优点:最容易实现,最容易在前端。 缺点:限制在20个技能内,大量的空值,过大的尺寸

想法二:在一个文本对象中使用所有技能输入一个大文本表,该文本对象由逗号或|等字符分隔。另一列proficiencies以相同的方式分隔。同样,USERID作为FK。 优点:易于实现,表大小小,易于在前端获取信息 缺点:可能会浪费大量的空白空间,需要在存储前和检索时在前端进行更多的编码

想法三:有技能和熟练程度栏的小桌子。然后创建多个与每个USERID相关的行 优点:最小的桌子和最干净的桌子。节省最多的空间 缺点:前端实现会很有趣,比如,如何处理多个字段以获得无限量的条目(不是我的东西,但我不想给前端人员带来太多问题)

这是我的三个想法,我不完全确定什么是最好的,所以。。。我在问你们。如蒙指教,不胜感激

谢谢


-Jabsy

在数据库级别实现此功能的最佳方法是创建4个表:

  • 用户(您可能有这个)
  • 技巧
  • 熟练程度
  • 技能熟练程度(fk_用户id、fk_熟练程度id、fk_技能id)
这样您就不会浪费空间,您的体系结构将更具可扩展性和可维护性

您解决了前端实现的问题。解决这一问题的最佳方法是创建数据库视图(您使用哪个数据库引擎?),其中包含更“前端友好”的数据视图。对模式进行非规范化以简化前端开发不是一个好主意,主要是因为数据操作是信息系统中最脆弱的操作。保持您的模式整洁,将来在扩展和添加新功能时,您将省去很多麻烦。

以下是我的做法

表1:包含一列,列出了所有可能的技能


表2:包含三列,一列为userID,第二列为相关技能。使用复合键时,第二列仅限于第一个表中的条目。再加上第三列和他们的能力水平(这可能需要引用另一个表,这取决于它是一个值还是一个单词)。一个用户在这个表中可能有20个不同的条目。

以规范化的方式存储数据。具有
用户ID
主键的
用户
表,具有
技能ID
主键的
技能
表,以及具有
用户ID
用户技能
表,具有
技能ID
熟练程度


我不确定我是否理解你所建议的第三种选择。如果是,我不太确定前端会有什么问题。据推测,将有一个界面,用户在其中添加新技能并输入他们的熟练程度。这似乎非常自然地映射到一个正确规范化的模式。

我将创建3个表:

  • USER
    带有主键的表
    USER\u ID
  • SKILL
    带有主键
    SKILL\u ID
    的表,以及一列
    SKILL\u description
  • USER\u SKILL
    具有以下结构的表:
    • USER\u ID
      ,对
      用户的FK引用。USER\u ID
    • SKILL\u ID
      ,对
      SKILL.SKILL\u ID
    • 熟练程度
这样,通过在
skill
表中插入新的技能记录,您就可以灵活地在将来包含更多不同的技能类型


关于如何查询每个用户的技能和熟练程度的结果,如果您使用的是oracle,您可以参考此链接。您的问题描述应该与此链接相同。

因此,通过此实现,我将根据我的用户id从我的技能表中进行SQL选择,然后使用返回值映射到我的熟练程度和相应的技能,因为它们将位于同一元组中?编辑:另外,我使用的是MYSQLYou可以使用database Join并通过查询数据库来选择它。例如,如果您需要特定用户及其技能名称和熟练程度名称,您将使用:选择users.name、skills.name、,prof.name from skill\u prof sp internal join users us.id=fk\u userid sp.fk\u skill\u id=skills.id internal join proficiencies prof.id=sp.fk\u proficiencyid where users.id=YOUR id选择我认为第三个选项的意思是有一个包含4列的表,比如table\u id,skill,prof,还有用户id。这样我就可以在用户id上搜索,一下子就把所有信息都找回来了。