2016-12-19 3 views
0

enter image description hereтаблицы SQL, две таблицы, чтобы ссылаться на один столбец в таблице третей

У меня есть два вида пользователей: Человек и общество.

Я хочу сохранить их пароль в одном столе.

Как подключить эти две таблицы с помощью пароля? Использование SQL-сервера (MSSQL)?

Возможно, есть другие способы сделать это?

Я не хочу оставлять таблицы hashedPass в Person или Company, потому что я хочу сохранить любые изменения пароля, которые пользователь сделал.

+0

Вы спрашиваете, какой внешний ключ вы должны использовать? – scsimon

+0

Я спрашиваю, как это сделать. Есть много типов внешнего ключа? –

+0

Странная часть - это поле входа в систему? –

ответ

1

Создайте таблицу суперкласса для всех пользователей и поместите туда пароль (а также любые другие атрибуты, которые доступны для всех пользователей). Затем создайте подклассы Person и Company таблиц пользователя.

EDIT: если вам нужен третий тип пользователя (например, приложения - для программных приложений, которым необходимо войти в систему), добавьте еще одну таблицу для этого типа пользователя в качестве третьего подкласса.

enter image description here

+0

Это отчасти индивидуальные отношения? –

+0

Да, хотя технически это отношение «1 <=> 0/1' (один-к-ноль или один). –

+0

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

0

Это звучит как довольно прямо вперед иностранный ключ:

ALTER TABLE person 
ADD CONSTRAINT person_fk FOREIGN KEY(id) 
REFERENCES passowrd(user_id); 

ALTER TABLE company 
ADD CONSTRAINT company_fk FOREIGN KEY(id) 
REFERENCES passowrd(user_id); 
+0

, а затем, когда я буду искать пароль по идентификатору пользователя, как он узнает погоду, найдет ли это личный стол для стола или компаний? –

1

Я думаю, что вы собираетесь в неправильном направлении. Поставьте PasswordId в каждой таблице, где вы хотите, пароль:

create table Person (
    . . . 
    PasswordId int references Passwords(PasswordId) 
); 

. . . 

create table Passwords (
    PasswordId int identity(1, 1) primary key, 
    . . . 
); 

Затем удалить userId из Passwords таблицы.

+0

Я сказал, что я этого не хочу, потому что я не могу отслеживать смененный пароль с этим «направлением» –

+0

@mister_giga нет никакой причины, по которой вы не можете отслеживать измененный пароль с этим aproach. И у Гордона есть хороший момент, вы пытаетесь присвоить свойство 'user_id' сущности' Password', и это не естественно. «Пароль» является свойством «Пользователь». –

+0

Гордон, почему у вас в вашем аватаре есть йети (или призрак?)? –

0

Добавить еще одну таблицу:

Entity 
------ 
id 
Entitytype [company/person] 
ExternalID [either person.id or company.id] 

Ссылка Password.user_id к Entity.id

+0

Хмммм, я не подставил. Это тип данных? –

+0

или я должен собрать еще 2 стола? –

1

Ну, это, вероятно, не является единственным решением, но я смотрю на создание таблицы USER с USER_ID и любые столбцы являются общими для ЧЕЛОВЕКА и КОМПАНИИ; затем обработайте таблицу PERSON и таблицу COMPANY как таблицы расширений USER. Это решает сразу несколько проблем:

1) Вы можете создать простой FK из таблицы ПАРОЛЯ к таблице USER 2) Вам не придется беспокоиться о каком-то образом звукозаписывающей компании и запись PERSON дублирующего значения идентификатора

+0

Да, но это нехорошее решение, а что, если мне придется добавить другой тип пользователя? –

+0

На самом деле это хорошее решение - идентичное тому, которое вы ответили на самом деле. Но не беспокойтесь; если вы хотите оскорбить совет, который вам даны, я не буду ощущать необходимости снова предлагать вам совет. –

+0

Я не собирался оскорблять кого-либо, ваше решение хорошее, но у меня был вопрос об этом, и я спросил его. И спасибо за ваш совет. –