Схема базы данных для веб-сайта назначения - это отношение "многие ко многим"?
Я создаю сайт asp.net (через Expression Web 4 и Visual Web Developer 2010 Express), используя базу данных, созданную с помощью Sql Server 2008. Однако я застрял в отношении схемы базы данных, которая поступает на сайт.
Создаваемый веб-сайт должен позволять создавать судебные дела с указанием типа дела, после чего юристы и / или адвокаты и / или вспомогательный персонал будут зарегистрированы как работающие над делом.
Таким образом, дело под названием "Крамер против Крамера" будет делом о разводе с участием двух адвокатов, одного адвоката и четырех вспомогательных сотрудников. Однако другим делом "Люди против Ларри Флинта" может быть дело обвинения с участием 4 адвокатов, без адвоката и 10 вспомогательных сотрудников.
Что я сделал до сих пор, так это то, что у меня есть таблица под названием "Таблица дел", которая содержит следующие столбцы:
Case_ID (это первичный ключ для таблицы); Case_Type_ID; Lawyer_ID; Advocate_ID и Support_Staff_ID. Последние 4 столбца в таблице дел - это внешние ключи.
Таблица Case_Type просто имеет два столбца: "Case_Type_ID" (PK) и "Area_of_law". Case_Type_ID - это просто числа (001,002...), а Area_of_law - char(30) (например, судебный процесс, развод, собственность, преступник). Все идет нормально.
Проблема заключается в том (и это относится к адвокатам и вспомогательному персоналу), если я создаю таблицу юристов, которая просто состоит из трех столбцов:
Столбцы = Lawyer_ID (в качестве первичного ключа) | Имя | Фамилия
запись 1 = 001 | Том | Hanks
запись 2 = 002 | Том | Морское путешествие
запись 3 = 003 | Даниэль | Craig
запись 4 = 004 | Николь | Кидман
как мне тогда назначить нескольких юристов по делу?
В пределах таблицы дел, чтобы соответствовать правилам нормализации, предположительно, мне нужно было бы добавить столбцы в таблицу дел, как описано выше, чтобы она записывала Lawyer_ID_1 (FK)| Lawyer_ID_2 (FK)| Lawyer_ID_3 (FK) | Юрист_ID_4 (ФК).
Так что это может быть 004 | 002 | Null | Нулевое, чтобы показать, что Николь Кидман и Том Круз работают над этим делом. Если бы у меня была только одна колонка Lawyer_ID, чтобы показать, что Николь Кидман и Том Круз работают над этим делом, это будет "004,002", что является большим "нет-нет" из того, что я прочитал на этом сайте.
Записав всех юристов в отдельную таблицу, я могу создать список флажков с привязкой к данным (привязанный к таблице юристов) в Visual Web Developer 2010 Express, поскольку он заполняет список именами юристов. Поэтому я доволен этим подходом.
Но если бы тогда было 50 юристов в Таблице юристов, мне нужно было бы иметь 50 столбцов в Таблице дел, предназначенных только для юристов (если дело заканчивалось 50 юристами, работающими над ним). Этот подход проблематичен, так как таблица дел может быть искажена, если юристы будут удалены или добавлены, потому что количество колонок юристов будет затронуто. Очевидно, это плохой подход, так может кто-нибудь помочь?
Существует ли схема базы данных, которая позволила бы связать одну запись "Дело" с несколькими записями "Юрист" без множества столбцов? (надеюсь, схема также может быть применена к таблице вспомогательного персонала и таблице адвокатов).
Ваша помощь будет высоко ценится. Я новичок в веб-разработке и работе с базами данных sql, и я пытался найти решение, но я, вероятно, не знаю ключевые слова для моей проблемы.
1 ответ
Вероятно, это отношения многие ко многим. Позвольте мне немного объяснить 3 отношения в вашем случае:
Если в каждом деле есть только один адвокат, и каждый адвокат может работать только над одним делом, то у вас есть отношения один к одному.
Если в каждом деле есть только один адвокат, но каждый адвокат может работать над несколькими делами, то у вас есть отношения один ко многим. Аналогично, если в каждом деле может быть несколько юристов, но каждый юрист может работать только над одним делом, то у вас все еще есть отношения один ко многим.
Если в каждом деле может быть несколько юристов, и каждый юрист может работать над несколькими делами, то у вас много-много отношений.
Типичное решение для отношения многих ко многим состоит в том, чтобы иметь третью таблицу для описания отношения:
create table casesALawyerWorksOn (case_id, lawyer_id)
Если @albert, @brad и @christine работают над делом @peopleVflynt, то:
insert into casesALawyerWorksOn (case_id, lawyer_id) values
(@albert, @peopleVflynt)
(@brad, @peopleVflynt)
(@christine, @peopleVflynt)
Таким образом, все дела, над которыми работает адвокат @fred:
select case_id from casesALawyerWorksOn where lawyer_id = @fred
и все юристы, которые работают над делом @kramerVkramer:
select lawyer_id from casesALawyerWorksOn where case_id = @kramerVkramer