Я вижу два варианта, оба из которых в основном дают один и тот же результат:
FK от dbo.aspnet_User.UserID
до dbo.Profile.UserID
, затем определите уникальный ключ для dbo.Profile.UserID
(если вы не используете его в качестве столбца PK для dbo.Profile
)
FK от dbo.aspnet_Profile.ProfileID
до dbo.Profile.ProfileID
dbo.aspnet_User
логически 1 - 1 с dbo.aspnet_Profile
, поэтому не имеет значения, какой подход вы используете, поскольку вы все равно получите ту же целостность отношений.
Если вы заменяете стандартную таблицу данных профиля своей собственной реализацией, то имеет смысл использовать первое предложение, в противном случае, если вы расширяете схему профиля, используйте второе предложение.
EDIT
aspnet_Profile
- это стандартная таблица - стандарт SqlProfileProvider
хранит данные профиля пользователя в виде сериализованного пакета свойств в aspnet_Profile
, поэтому также не существует отдельной таблицы aspnet_ProfileData
.
Этот подход позволяет легко настраивать схему профиля для различных приложений, не требуя каких-либо изменений в базовой базе данных, и является наиболее оптимальным решением для такой среды, как .NET. Недостатком является то, что SQL Server вообще не имеет легкого доступа к этим данным, поэтому намного сложнее индексировать, обновлять и запрашивать данные профиля пользователя с использованием T-SQL и логики на основе множеств.
Наиболее распространенный подход, который я видел для снятия этого ограничения, заключается в расширении стандарта SqlProfileProvider
для записи в таблицу данных пользовательского профиля, в которой есть специальные столбцы для свойств профиля для конкретного приложения. Эта таблица, естественно, имеет отношение 1-1 к таблице aspnet_Profile, поэтому она имеет внешний ключ, как указано выше.
Роль расширенного поставщика заключается в добавлении определенных свойств профиля к столбцам во время записи профиля и чтении в столбцах при получении профиля.
Это позволяет вам смешивать и сопоставлять решения для хранения данных по мере необходимости, если ваш расширенный поставщик знает, как использовать стандартную реализацию, где он не «знает» о данном свойстве.
Я всегда думаю, что лучше оставить стандартные таблицы членства такими, как есть, и расширять их при необходимости, используя новые таблицы с соответствующими внешними ключами, затем создавать подклассы соответствующего поставщика и переопределять методы поставщика своей собственной реализацией (вызывая базу реализация везде, где это возможно).