#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
таблице должно быть как минимум две записи, одна из которых называется «Студент», а другая — «Факультет», но также может быть предусмотрено больше ролей.)
Здесь есть несколько преимуществ:
- Вам нужно хранить только имена и адреса в одном месте, а не дублировать модель для разных ролей.
- У пользователя может быть несколько ролей. Например, преподаватель может посещать некоторые занятия и некоторое время быть «студентом». Аспирант может вести некоторые занятия и некоторое время быть «преподавателем».
- Новые роли могут быть добавлены без необходимости изменять модель данных.