2011-02-24 159 views
0

我不确定完全如何将这个问题说出来,所以我会解释我在想什么。我以前有设计数据库的经验,但实际上还没有决定我想如何实现这个或者之前运行过这个。我会解释我在想什么作为一种显示方式,我已经想到了这一点...数据库设计:多个相同类型的项目

我创建了一个数据库,将存储用户的信息,像一个简历(这是一个副项目为一群大学生)。我遇到的问题是如何处理存储大量技术技能的问题,可能是每个用户20+以上的顺序以及他们的熟练程度

想法一:一个巨大的表格,包含TechSkill1列 - > 20.随着他们的熟练程度。使用用户ID作为FK与所有这些关联。 优点:最简单的工具,最简单的前端。 缺点:限于20个技能,很多潜在的空值,过大的尺寸

想法二:一个大文本输入的表格,所有技能都在一个文本对象中,用逗号或| |等一些字符分隔。另一个精通专栏也以同样的方式划定界限。再次,USERID作为FK。 优点:易于实现,小桌子大小,易于在前端获得信息 缺点:浪费大量空白空间的可能性,需要在商店前面进行更多的编码,然后再进行检索。

想法三:小桌子的技巧和熟练的专栏。然后创建多个行来关联每个USERID 优点:最小的表和最干净。节省最多的空间 缺点:前端实现将很有趣,因为在如何处理无限数量的条目的多个领域(不是我的东西,但我不想为前端家伙创造太多问题)

这些是我的三个想法,我不完全确定什么是最好的......我问你们。所有的意见将不胜感激。

谢谢!实现这个数据库级别

-Jabsy

回答

1

最好的办法是创建4个表:

  • USERS(你可能有此一)
  • 技能
  • 精通
  • SKILLS_PROFICIENCIES( fk_userid,fk_proficiencyid,fk_skill_id)

这样你就不会浪费空间,你的架构将更具可扩展性和可维护性。

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

+0

所以这个实现我的SQL从我Skill_prof表基于我user_ID的选择,然后使用从返回映射到我的能力和相应的技能,因为他们都将在同一个元组? 编辑:另外,我正在使用MYSQL – Jabsy 2011-02-24 08:55:43

+0

您可以使用数据库加入,并通过1查询选择它到数据库。例如,如果你想具体的用户和他的技术名称和熟练的名字,你会用:SELECT users.name,skills.name,prof.name从skill_prof SP内部联接用户us.id = fk_userid内部联接上sp.fk_skill_id =技能技巧.id内部连接熟练prof.id = sp.fk_proficiencyid prof.id其中users.id =您的ID请选择 – 2011-02-24 09:12:26

+0

非常感谢! – Jabsy 2011-02-24 09:19:59

0

下面是我该怎么做。

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

0

以规范化的方式存储数据。具有USER_ID主键的USER表,具有SKILL_ID主键的SKILL表和具有USER_IDSKILL_IDPROFICIENCY列的USER_SKILL表。

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

+0

我认为我的第三种选择的意思是有一个table_id,skill,prof和user_id等4列的表。这样我就可以搜索用户ID,并一次性获取所有信息。 – Jabsy 2011-02-24 09:03:14

0

我将创建3个表:

  • USER表与PK USER_ID
  • SKILL表与PK SKILL_ID,列SKILL_DESCRITPION
  • USER_SKILL表具有以下结构:
    • USER_ID,FK参考USER.USER_ID
    • SKILL_ID,FK参考SKILL.SKILL_ID
    • PROFICIENCY

通过这种方式,它可以为您提供的灵活性,在简单地插入一个新技能的记录,包括在未来更多的不同的技术类型SKILL表。

有关如何查询每个用户具有哪些技能和熟练度的结果,如果您使用的是oracle,请参阅http://bytes.com/topic/oracle/answers/64603-help-decode-function-crosstab-query。您的问题描述应该与此描述的链接相同。

相关问题