我有一张表Users
:
[UserId] [int] IDENTITY(1,1) NOT NULL,
[UserName] [nvarchar](20) NOT NULL,
[Email] [nvarchar](100) NOT NULL,
[Password] [nvarchar](128) NOT NULL,
[PasswordSalt] [nvarchar](128) NOT NULL,
[Comments] [nvarchar](256) NULL,
[CreatedDate] [datetime] NOT NULL,
[LastModifiedDate] [datetime] NULL,
[LastLoginDate] [datetime] NOT NULL,
[LastLoginIp] [nvarchar](40) NULL,
[IsActivated] [bit] NOT NULL,
[IsLockedOut] [bit] NOT NULL,
[LastLockedOutDate] [datetime] NOT NULL,
[LastLockedOutReason] [nvarchar](256) NULL,
[NewPasswordKey] [nvarchar](128) NULL,
[NewPasswordRequested] [datetime] NULL,
[NewEmail] [nvarchar](100) NULL,
[NewEmailKey] [nvarchar](128) NULL,
[NewEmailRequested] [datetime] NULL
此表格与Profiles
的 1对1关系:
[UserId] [int] NOT NULL,
[FirstName] [nvarchar](25) NULL,
[LastName] [nvarchar](25) NULL,
[Sex] [bit] NULL,
[BirthDay] [smalldatetime] NULL,
[MartialStatus] [int] NULL
我需要将user
连接到数据库中的所有其他表,所以最好是:
1)建立从Users
到其他表的关系?
2)从Profiles
- 与其他表格建立关系?
答案 0 :(得分:2)
由于表[Users]包含Identity值,因此是[UserID]值的来源,我将创建所有外键。从性能角度来看,假设您在[UserID]列上设置的两个表上都有聚集索引,那么性能影响应该非常小。
从技术上讲,我认为[Users]表每行可以包含更多数据,因此索引可以跨越更多页面,你可能在查找中有几毫秒的差异,但我认为将它与创建的表关联起来更有意义[UserID]并且名称相似。也就是说,你可以做到。
答案 1 :(得分:0)
如果Profiles
的PK是Users
的FK,我会保持一致性并使用Users
作为数据库中其他关系中的父表。
但是,如果它是真正的一对一而不是一对一或一对一的关系,则没关系。
另一个考虑因素是如何通过任何应用程序访问此数据库中的数据。应用程序是否使用OR / M类实体框架,它知道FK关系?如果是这样,请考虑使用具有列的表,这些列最常通过基于子表的查询来访问。例如,应用程序可能会在所有位置显示Profiles.LastName
和Profiles.FirstName
,并且很少从Users
表中读取任何内容。在这种情况下,您将通过在Profiles
表之外建立关系来为数据库保存一些I / O并为开发人员保存一些按键。