Проектирование базы данных с использованием SQL Server 2005,

#sql-server-2005

#sql-server-2005

Вопрос:

У меня есть user таблица с userid (pk), password, usertype .

У меня есть другая таблица student с stdid (pk), stdname, stdaddress .

У меня есть третья таблица faculty с facid (pk), facname, facaddress .

Что я хочу сделать, так это заполнить user таблицу значением pk либо из student таблицы, либо из faculty table.

Как мне реализовать это в SQL Server 2005.

Кто-нибудь может мне помочь?

Отредактировано ниже

В моей базе данных таблица student и faculty уже реализована как часть другого модуля. Мне нужно реализовать часть аутентификации по локальной сети, чтобы иметь возможность доступа из любого места, поэтому я не могу реструктурировать эту часть. Итак, я использую таблицу user с идентификатором пользователя (username) и паролем в этой таблице.

Идентификатор пользователя — это либо stdid, либо facid, а также pk пользовательской таблицы.

Комментарии:

1. Как связаны эти три таблицы? Вы не упомянули никаких внешних ключей.

2. просто замечание, но, пожалуйста, не ставьте префиксы в таких столбцах, как fac и std

3. Но также никогда не используйте ID. Это может вызвать проблемы с отчетностью и ошибочными ссылками в объединениях и вообще не является хорошей практикой. Укажите преподавателя или студента.

Ответ №1:

У вас плохой дизайн. Вы не хотите использовать тот или иной другой PK в качестве PK в таблице. Это не может работать со всеми. Что происходит, когда вы пытаетесь вставить ученика 10 (который Джо Джонс), но факультет 10 (Мэри Смит) уже есть в таблице. Ну, вставка завершилась бы неудачей из-за уникального требования PK.

Если все студенты и преподаватели всегда являются пользователями, то userId — это PK, а FacultyId и StudentID — это FK для этой таблицы, а не наоборот.

Комментарии:

1. Все стандартные идентификаторы имеют префикс ‘S’, а все facid имеют префикс ‘F’.

2. Итак, я должен получить идентификатор пользователя как pk и получить другое поле для ввода либо stdid, либо facid?

Ответ №2:

вставить в пользовательскую таблицу (выберите facid в качестве идентификатора пользователя из facultaty_table, выберите stdid в качестве идентификатора пользователя из student_table)

при этом в столбце password и usertype останутся значения null, в противном случае он загружает userid_table со всеми PKS из других

Комментарии:

1. А если stdid и facid происходят из перекрывающихся доменов?

Ответ №3:

Каковы типы данных ключей? Есть ли гарантия, что они будут уникальными в таблицах student и faculty?

Похоже, со временем с этим проектом будет сложно работать. Может быть, попробовать перенести основное внимание с таблиц «person» на таблицу user и назначить роли оттуда? Что-то вроде этого:

 User
------
Id
Password
UserType
(where's the username?)

UserInfo
------
UserID
Name
Address

Role
------
Id
Name

UserRole
------
UserID
RoleID
  

Role таблице должно быть как минимум две записи, одна из которых называется «Студент», а другая — «Факультет», но также может быть предусмотрено больше ролей.)

Здесь есть несколько преимуществ:

  1. Вам нужно хранить только имена и адреса в одном месте, а не дублировать модель для разных ролей.
  2. У пользователя может быть несколько ролей. Например, преподаватель может посещать некоторые занятия и некоторое время быть «студентом». Аспирант может вести некоторые занятия и некоторое время быть «преподавателем».
  3. Новые роли могут быть добавлены без необходимости изменять модель данных.