作为一个 uni 项目,我正在为敏捷项目构建一个类似 jira 的简约项目管理工具。我将在 Java 和 Hibernate 中使用 MySql。到目前为止,这是我的数据库模式。你会推荐任何改变吗?
2 回答
关于您的要求,您给我们的信息很少,但我会尝试根据我(非常有限的)经验提出一些建议。
- 您需要从逻辑上考虑您将如何使用您的数据库并从中创建您的设计。在我看来,项目是系统的中心,所以一切都应该围绕实体来考虑。
- 一个项目有许多 Sprint。
- Sprint 有很多故事。
- 一个故事有许多故事任务。
- 每个 StoryTask 都有一个分配的用户。
所以从这个概念出发,我们已经有了一个简单的设计:
Project --< Sprint --< Story --< StoryTask -- Person
然后您可以更详细地考虑诸如“我是否希望我的用户能够处理多个任务?”之类的事情。如果答案是肯定的,那么您可以与 Person 建立一对多关系:
Project --< Sprint --< Story --< StoryTask >-- Person
并不是说您有您认为可行的基本设计,您可以更详细地考虑您的查询。例如,如果您想获得所有参与您项目的人员的列表,您将不得不编写一个长查询来连接和搜索所有涉及的表。对于常用功能,例如列出项目中的所有人员,您可以在 Person 和 Project 之间创建连接:
Person* >-- Project --< Sprint --< Story --< StoryTask >-- Person*
此外,如果您计划让一个人与多个项目相关联并且能够查询该人参与过哪些项目,则需要创建一个关系表
Person* --< ProjectPersonnel >-- Project --< Sprint --< Story --< StoryTask >-- Person*
在设计数据库之前考虑将要运行的查询总是更好。例如,如果您想要一个人员参与的所有项目的列表,您可以使用一个相对简单的查询
SELECT proj.ProjectName FROM Person per LEFT JOIN ProjectPersonnel pp ON per.PersonId = pp.PersonId LEFT JOIN Project proj ON pp.ProjectId = proj.ProjectId WHERE per.FistName = 'Bob'
如果您想要一个与项目中的 Sprint 相关联的所有故事的列表,那么您有适当的结构来为该项目创建一个简单的查询
SELECT
story.StoryName
FROM
Story story
LEFT JOIN Sprint sprint
ON story.SprintId = sprint.SprintId
LEFT JOIN Project proj
ON sprint.ProjectId = proj.ProjectId
WHERE
proj.Name = "MyProject1"
AND
sprint.Number = "3"
正如我所说,我在该领域没有太多经验,所以肯定有更好的建议 - 我只是希望这有点有用。
我建议将id
字段定位到第一个位置,每个表都应该有主键,每个主键应该有不同的名称。
喜欢:project
=> project_id
,person
=> person_id
,.......
此操作将有助于您进行数据库查询和部署的应用程序。希望这可以帮助。