设计一个SQL表并在第一次就把它弄好

时间:2008-11-26 19:47:20

标签: sql database-design

我目前正在为我公司的问题跟踪器工作,以帮助他们跟踪网络出现的问题。我正在使用C#和SQL。

每个问题都有大约需要跟踪的二十件事情(状态,工作损失,创建者,谁在做什么等)。我需要将受问题影响的团队列表附加到主要问题表中的每个条目。理想情况下受影响的团队列表包含指向唯一表格实例的某种链接,仅针对该问题,显示受影响的团队列表以及每个团队实验室受影响的百分比。

所以我的问题是,在问题表的条目和该问题的唯一表之间实现这种“链接”的最佳方式是什么?或者我在想这个问题是错的。

9 个答案:

答案 0 :(得分:14)

你所描述的被称为“多对多”关系。一个团队可能受到许多问题的影响,同样一个问题也会影响到许多团队。

在SQL数据库设计中,这种关系需要第三个表,其中包含对其他两个表中每个表的引用。例如:

CREATE TABLE teams (
  team_id INTEGER PRIMARY KEY
  -- other attributes
);

CREATE TABLE issues (
  issue_id INTEGER PRIMARY KEY
  -- other attributes
);

CREATE TABLE team_issue (
  issue_id INTEGER NOT NULL,
  team_id INTEGER NOT NULL,
  FOREIGN KEY (issue_id) REFERENCES issues(issue_id),
  FOREIGN KEY (team_id) REFERENCES teams(team_id),
  PRIMARY KEY (issue_id, team_id)
);

答案 1 :(得分:3)

这听起来像是经典的多对多关系...... 你可能想要三个表,

  1. 一个问题,每个独立问题创建一个记录(行)......

  2. 一个团队,每个团队有一个记录......

  3. 还有一个名为“IssueTeams”或“TeamIssueAssociations”或“IssueAffectedTeams”的表来保持两者之间的联系......

    最后一个表将为每个团队提供一个记录(行),问题会影响...此表将有一个2列复合主键,列在IssueId,AND TeamId ...每行必须有这两个值的唯一组合......每个值分别是问题表的外键(FK)和团队表。

  4. 对于每个团队,此表中可能有零到多条记录,对于团队受影响的每个问题,

    并且对于每个问题,可能存在零到多个记录,每个记录代表问题影响的团队。

答案 2 :(得分:2)

如果我理解正确的话,我会创造......

  • 包含20个所以项目的ISSUE表
  • 包含团队列表的TEAM表。
  • TEAM_ISSUES表包含两个
  • 的链接

TEAM_ISSUES表需要包含ISSUE和TEAM表的foriegn密钥(即它应该包含一个ISSUE_ID和一个TEAM_ID ......因此它充当两个“主”表之间的交集。听起来这是也是放百分比的地方。

这有意义吗?

答案 3 :(得分:2)

有很多优秀的免费开源问题跟踪器,你应该有很好的理由来实现自己的。您可以更好地利用自己的时间来定制现有的跟踪器。

我们在我工作的团队中使用Bugtracker.NET。它已经定制了很多,但从一开始就没有必要开发系统。我们选择该产品的原因是它在.NET上运行并且与SQL Server配合使用,但还有许多其他选择。

答案 4 :(得分:1)

我们可以在您的域中看到实体

  1. 问题
  2. 团队”受该问题的影响,按一定比例
  3. 因此,在识别出这两个项目之后,您可以用两个表来表示它们,并且它们之间的关系是另一个表,它也可以跟踪百分比影响。

    希望这有帮助。

答案 5 :(得分:1)

我不会为每个问题创建一个唯一的表。我会做这样的事情

Table: Issue
IssueId primary key
status
workLoss
createdby
etc

Table: Team
TeamID primary key
TeamName
etc

Table: IssueTeam
IssueID (foreign key to issue table)
TeamID (foreign key to team table)
PercentLabsAffected

答案 6 :(得分:1)

除非我理解你正在尝试做的事情,否则你不应该为每个问题实例提供一个唯一的表格。

您的数据库应该有三个表:问题表,Teams表和IssueTeams连接表。 IssueTeams表将包括引用团队中相应团队和问题中的问题的外键(即TeamID和IssueID)。因此,问题团队可能会有(Issue1,Team1),(Issue1,Team3)等记录。您可以将每个团队实验室的受影响百分比保留在加入表中。

答案 7 :(得分:1)

嗯,只是为了成为现代和敏捷的人,“第一次正确行事”不像“可重构”那样时髦。但要完成你的模型:

你有问题(嘿嘿)。你有团队。

问题影响了许多团队。团队受到许多问题的影响。所以只是对于基本问题,你似乎有一个经典的很多:很多关系。包含两列的连接表,一列用于发布PK,另一列用于Team PK。

然后你有问题是团队的百分比。当然,这是一个动态的方面,所以要做到正确,你需要指定一个触发器。但显而易见的地方是问题中的一列(“Affected_Team_Percentage”)。

答案 8 :(得分:0)

如果我理解正确,您希望为每个问题创建一个受影响的新团队表。在正常操作中创建表会使我的关系数据库设计响铃。不要这样做!

而是使用一个带有foreign key的affected_teams表到issues表,以及一个外键到teams表。这样就可以了。