2012-11-20 4 views
1

В настоящее время я работаю над реляционной базой данных SQL Server, к которой будет обращаться через Entity Framework. У меня есть пара вопросов, на которые я, похоже, не нахожу правильных ответов.Денормализация и добавление нескольких идентификаторов в одну строку

Пожалуйста, смотрите мою диаграмму модели базы данных:

enter image description here

1. Я не совсем уверен, что если ProblemType реализации является правильным путем. Как уже было установлено, оба столбца допускают нулевые значения в ProblemType, поскольку он либо будет содержать ProblemTypeRoadID, либо ProblemTypeVandalismID. Поэтому вопрос в том, действительно ли можно де-нормализовать модель, удалив таблицу ProblemType и связав ее как ProblemTypeRoad, так и ProblemTypeVandalism в таблице ProblemDesc?

2. Глядя на Problem таблице вы найдете столбец с именем HistoryIDs. Этот столбец должен содержать строку с разделителями-запятыми со всеми HistoryIDs, связанными с Problem. A HistoryID по существу равен ProblemDescID (так как ProblemDesc получает свой столбец IsHistory, установленный в true, когда он обновляется), поскольку ProblemDesc копируется при каждом изменении. Мой вопрос: что такое лучший способ добавить несколько ProblemDescIDs в колонку HistoryIDs? Если бы это было что-то вроде «1,5,7», было бы легко найти все истории для данного ProblemDesc.

3. Любых других предложений по диаграмме также очень приветствуется :)

Спасибо заранее!

EDIT: Пожалуйста, обратите внимание пересмотренную диаграмму:

enter image description here

Теперь, когда вы дали мне некоторые большие предложения по улучшению, я попытался реализовать большинство ваших предложений. ProblemType был удален и добавлен ProblemHistory. Были также внесены изменения в то, как WorkerComment и Media относятся к их родительским таблицам. Будет ли эта реализация работать?

Спасибо!

+4

# 2: ** не делайте этого! ** это нарушает даже первую нормальную форму ** дизайна базы данных: ячейка (строка/столбец) должна содержать ** не более одного значения * * (и только одно значение - или ничего) - но ** никогда ** несколько значений! Забивание нескольких идентификаторов в строку с разделителями-запятыми собирается сделать выбор этих значений позже грязным адом! Не делай этого - серьезно - просто нет. .... –

ответ

3
  1. Вы можете удалить таблицу problemtype, и просто связаны problemtyperoad и problemtypevandalism к столу problemtype с типом проблемы ид

  2. Нет, это не должно быть. У вас должна быть таблица ProblemHistory с столбцами ProblemID и HistoryID со строкой для каждой Истории.

  3. Кажется, у вас может быть комментарий рабочего, относящийся к нескольким проблемам. Разве это будет наоборот? Аналогично для media и ProblemDescs. Может ли только один рабочий работать над проблемой? Кроме того, MSSQL имеет тип географии, который можно использовать вместо CoordinateLat и CoordinateLng.

+0

+1 да, за # 2 - это единственный разумный дизайн! –

+0

В настоящее время я работаю над вашими предложениями (опубликую новую диаграмму, как только закончите). Просто чтобы ответить 3. Рабочий компонент должен быть связан только с одной проблемой, и то же самое касается Media и ProblemDesc. Проблема может быть назначена только одному Работнику, но Работник может работать с несколькими проблемами. – thilemann

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