数据库设计:多个相同类型的项目
我不确定完全如何将这个问题说出来,所以我会解释我在想什么。我以前有设计数据库的经验,但实际上还没有决定我想如何实现这个或者之前运行过这个。我会解释我在想什么作为一种显示方式,我已经想到了这一点...数据库设计:多个相同类型的项目
我创建了一个数据库,将存储用户的信息,像一个简历(这是一个副项目为一群大学生)。我遇到的问题是如何处理存储大量技术技能的问题,可能是每个用户20+以上的顺序以及他们的熟练程度
想法一:一个巨大的表格,包含TechSkill1列 - > 20.随着他们的熟练程度。使用用户ID作为FK与所有这些关联。 优点:最简单的工具,最简单的前端。 缺点:限于20个技能,很多潜在的空值,过大的尺寸
想法二:一个大文本输入的表格,所有技能都在一个文本对象中,用逗号或| |等一些字符分隔。另一个精通专栏也以同样的方式划定界限。再次,USERID作为FK。 优点:易于实现,小桌子大小,易于在前端获得信息 缺点:浪费大量空白空间的可能性,需要在商店前面进行更多的编码,然后再进行检索。
想法三:小桌子的技巧和熟练的专栏。然后创建多个行来关联每个USERID 优点:最小的表和最干净。节省最多的空间 缺点:前端实现将很有趣,因为在如何处理无限数量的条目的多个领域(不是我的东西,但我不想为前端家伙创造太多问题)
这些是我的三个想法,我不完全确定什么是最好的......我问你们。所有的意见将不胜感激。
谢谢!实现这个数据库级别
-Jabsy
最好的办法是创建4个表:
- USERS(你可能有此一)
- 技能
- 精通
- SKILLS_PROFICIENCIES( fk_userid,fk_proficiencyid,fk_skill_id)
这样你就不会浪费空间,你的架构将更具可扩展性和可维护性。
你解决了前端实现的问题。解决这个问题的最好方法是使用更多的“前端友好”数据视图来创建数据库视图(您使用哪个数据库引擎?)。将模式非规范化以减轻前端开发并不是一个好主意,主要是因为数据操作是信息系统中最脆弱的操作。保持架构清洁,并且在扩展和添加新功能时将为您节省很多麻烦。
下面是我该怎么做。
表1:包含列出所有可能技能的单个列。表2:包含三列,一列的用户ID和第二列的关联技能。使用复合键,第二列仅限于第一个表中的条目。再加上他们的能力水平的第三列(这可能需要引用另一个表,它取决于它只是一个值还是它是一个单词)。用户在表格中可能有20个不同的条目。
以规范化的方式存储数据。具有USER_ID
主键的USER
表,具有SKILL_ID
主键的SKILL
表和具有USER_ID
,SKILL_ID
和PROFICIENCY
列的USER_SKILL
表。
我不确定我是否理解这是否是您建议的第三种选择。如果是这样,我不太清楚你在前端会遇到什么问题。据推测,将会有一个用户添加新技能并输入熟练程度的界面。这似乎很自然地映射到一个适当规范化的模式。
我认为我的第三种选择的意思是有一个table_id,skill,prof和user_id等4列的表。这样我就可以搜索用户ID,并一次性获取所有信息。 – Jabsy 2011-02-24 09:03:14
我将创建3个表:
-
USER
表与PKUSER_ID
-
SKILL
表与PKSKILL_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。您的问题描述应该与此描述的链接相同。
所以这个实现我的SQL从我Skill_prof表基于我user_ID的选择,然后使用从返回映射到我的能力和相应的技能,因为他们都将在同一个元组? 编辑:另外,我正在使用MYSQL – Jabsy 2011-02-24 08:55:43
您可以使用数据库加入,并通过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
非常感谢! – Jabsy 2011-02-24 09:19:59