Без понимания объектов и атрибутов, которые вы пытаетесь моделировать, на самом деле невозможно дать ответ на заданный вами вопрос.
Entity Relationship Моделирование
Что сущности ли ваша модель данных представляет? Сущность - это лицо, место, предмет, концепция или событие, которые могут быть однозначно идентифицированы, важно для системы, и мы можем хранить информацию о ней.
Из описания, данного в вопросе, мы думаем, что «пользователь» является сущностью. И, возможно, «ключ» также является сущностью. Мы не можем сказать из описания, является ли это сущностью, или является ли это повторяющимся (многозначным) атрибутом.
Что однозначно идентифицирует «пользователь»?
Какие атрибуты нам нужно/нужно хранить о «пользователе»?
Вторая часть понимает отношения между объектами.
Чтобы сделать это, мы должны спросить и получить ответы на некоторые вопросы, такие как:
Сколько «пользователи» могут быть связаны с определенным «ключ»?
Должен ли быть «ключ» связан с пользователем или может быть ключ связан с нулевыми пользователями?
Может ли «ключ» быть однозначно идентифицирован, кроме пользователя?
И так далее.
На основе этих ответов мы можем приступить к составлению модели и оценить, насколько хорошо эта модель представляет проблему, и насколько хорошо эта модель будет работать для наших ожидаемых вариантов использования.
Если «пользователь» и «ключ» являются сущностями, и между объектами существует взаимосвязь «многие-ко-многим», модель для этого будет выглядеть иначе, чем если «ключ» не является сущностью, но просто многозначный атрибут.
Если ключ должен «принадлежать» одному и только одному пользователю, а пользователь может «удерживать» ноль, один или несколько ключей, вероятно, это многозначный атрибут. Тогда нам нужны две таблицы. Одна «родительская» таблица для «пользовательской» сущности и другая «дочерняя» таблица для хранения повторяющегося атрибута.
Мы пока не знаем, какой набор атрибутов однозначно идентифицирует пользователя, поэтому мы будем представлять это с помощью общего атрибута «userid» некоторого неопределенного типа данных.
user
-----
userid datatype NOT NULL PRIMARY KEY
name varchar(30) NOT NULL
e.g.
userid name
------ ------
psimon paul simon
agarfu art garfunkel
Для хранения многозначного атрибута A, мы используем первичный ключ таблицы объекта в качестве внешнего ключа в нашей второй таблице «ребенок».
user_key
--------
userid datatype NOT NULL FOREIGN KEY ref user.userid
key VARCHAR(30) NOT NULL
e.g.
user_key
userid key
------- -------
psimon G major
psimon A major
psimon A major
psimon B minor
agarfu A major
Если мы решим, что «пользователь» будет иметь другой столбец в качестве первичного ключа, то мы будем использовать тот же столбец в качестве внешнего ключа в дочерней таблице.
В этом примере мы разрешили «дублировать» значения для «ключа» для данного пользователя. Если нам нужны только отдельные значения «ключа» для пользователя, нам нужно добавить ограничение UNIQUE для кортежа (userid, key)
.
Прежде чем мы будем слишком беспокоиться о производительности, нам необходимо заботиться о получении некоторых работоспособных моделей данных. Оттуда мы можем перевести это в некоторые реализации и оценить характеристики производительности каждого из них.
Если в реализации есть таблицы, которые не имеют подходящего первичного ключа, мы можем ввести другой столбец, который стоит в качестве «суррогатного» первичного ключа.
*** КАЖДЫЙ *** стол должен иметь ** первичный ключ **! –
Если у вас есть ** 1 ** пользователь с ** n ** ключами - правильный реляционный способ состоит в том, чтобы иметь ** две ** таблицы, которые связаны через общий столбец (например, 'userid'), как с надлежащим ** первичный ключ **, а второй подключен к первому через отношение внешнего ключа –