2008-11-26 2 views
1

В настоящее время я работаю над отслеживанием проблем для своей компании, чтобы помочь им отслеживать проблемы, возникающие в сети. Я использую C# и SQL.Проектирование таблицы SQL и ее правильное в первый раз

В каждом выпуске имеется около двадцати вещей, которые необходимо отслеживать (статус, потеря работы, кто создал его, кто над ним работает и т. Д.). Мне нужно прикрепить список команд, затронутых проблемой, каждой записи в моей основной таблице проблем. Список затронутых групп идеально содержит некоторую ссылку на уникальный экземпляр таблицы, только для этой проблемы, который показывает список затронутых групп и какой процент от каждой лаборатории лаборатории затронут.

Итак, мой вопрос - это лучший способ внедрить эту «ссылку» между записью в таблицу проблем и уникальной таблицей для этой проблемы? Или я думаю об этой проблеме неправильно.

ответ

14

То, что вы описываете, называется отношением «многие ко многим». На группу могут влиять многие проблемы, а также проблема может затронуть многие команды.

В конструкции базы данных SQL для такого рода отношений требуется третья таблица, содержащая ссылку на каждую из двух других таблиц. Например: «refactorable»

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) 
); 
+0

Я согласен с вашим решением (и проголосовал).Мое единственное изменение заключалось бы в том, чтобы исключить принудительные ограничения внешнего ключа RDBMS и справиться с этим в моих процедурах. Кроме этого, спот на! – 2008-11-26 20:11:58

2

Если я правильно понял вопрос правильно, я бы создать ....

  • ВЫПУСКА таблица, содержащая 20 так себе элементы
  • таблице TEAM, содержащий список команд.
  • TEAM_ISSUES таблица, содержащая ссылку beteen два

таблицы, TEAM_ISSUES должен содержать foriegn ключ к проблеме и КОМАНДЫ таблиц (т.е. она должна содержать ISSUE_ID и TEAM_ID ... он, следовательно, действует как . пересечение между двумя таблицами «мастером» Похоже, это также место, чтобы поставить процент

ли, что имеет смысл

1

Мы можем увидеть эти сущностей в домене:.?

  1. «Выпуск»
  2. «Команды» пострадавших от этого вопроса, в определенный процент

Итак, определив эти два элемента, вы можете представить, что с двумя таблицами, и отношение между ними - другая таблица, которая также может отслеживать процентное воздействие.

Надеюсь, это поможет.

3

Это звучит как классический многие-ко-многим ... Вы, вероятно, хотите три таблицы,

  1. один для вопросов, с одной записи (строки) в каждой отдельной уникальной проблеме, созданной .. .

  2. Один для команд, с одной записи для каждой команды в вашей компании ...

  3. И одна таблица называется сказать, «IssueTeams» или «TeamIssueAssociations» `или«IssueAffectedTeams»держать связь между этими двумя ...

    В этой последней таблице будет одна запись (строка) для каждой команды, на которую влияет проблема ... Эта таблица будет содержать 2-столбчатый составной первичный ключ, на столбцах IssueId, AND TeamId .. Каждая строка должна иметь уникальную комбинацию этих двух значений ...Каждый из них по отдельности представляет собой внешний ключ (FK) в таблице проблем и таблицу команд соответственно.

Для каждой команды может быть равна нулю для многих записей в этой таблице для каждого вопроса команда пораженной,

и для каждого выпуска, может быть от нуля до многих записей, каждая из которых представляет собой команду, на которую влияет проблема.

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 
1

Если я не буду понимать неправильно, что вы пытаетесь сделать, вы не должны иметь уникальную таблицу для каждого экземпляра вопроса.

Ваша база данных должна иметь три таблицы: таблицу «Проблемы», таблицу «Команды» и таблицу соединения IssueTeams. Таблица IssueTeams будет включать в себя внешние ключи (то есть TeamID и IssueID), которые ссылаются на соответствующую команду в командах и выпуски в «Проблемы». Поэтому у групп проблем могут быть такие записи, как (Issue1, Team1) (Issue1, Team3). Вы можете сохранить затронутый процент лабораторий каждой команды в таблице соединений.

1

Ну, просто чтобы быть все современные и ловок-у, «получить это право в первый раз» менее модно, чем Но для работы через вашу модель:

У вас есть проблемы (хе-хе). У вас есть Команды.

Проблема затрагивает многие команды. Многие проблемы затронуты группой. Так что для основной проблемы у вас, похоже, есть классика Many: Many relationship. Таблица соединений, содержащая два столбца, одна для выдачи ПК и одна для Team PK, позаботится об этом.

Тогда у вас есть вопрос о том, что% команд. Для этого есть динамический аспект, поэтому, чтобы сделать это правильно, вам нужно указать триггер. Но очевидным местом для этого является столбец «Проблема» («Affected_Team_Percentage»).

0

Если вы правильно поняли, вы хотите создать новую таблицу команд, затронутую для каждой проблемы. Создание таблиц как части обычных операций вызывает звонок будильника с реляционной базой данных. Не делай этого!

Вместо этого используйте таблицу affected_teams с foreign key в таблицу проблем и внешний ключ для таблицы команд. Это сделает трюк.

2

Существует так много хороших бесплатных трекеров с открытым исходным кодом, что у вас должны быть достаточно веские причины для реализации ваших собственных. Вы могли бы использовать свое время намного лучше в настройке существующего трекера.

Мы используем Bugtracker.NET в команде, в которой я работаю. Он был настроен совсем немного, но не было смысла разрабатывать систему с самого начала. Причина, по которой мы выбрали этот продукт, заключалась в том, что он работает на .NET и отлично работает с SQL Server, но есть много других альтернатив.

Смежные вопросы