需要关于桌子关系的建议

时间:2013-02-25 22:57:47

标签: sql-server database database-design relational-database

我有一张表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 - 与其他表格建立关系?

2 个答案:

答案 0 :(得分:2)

由于表[Users]包含Identity值,因此是[UserID]值的来源,我将创建所有外键。从性能角度来看,假设您在[UserID]列上设置的两个表上都有聚集索引,那么性能影响应该非常小。

从技术上讲,我认为[Users]表每行可以包含更多数据,因此索引可以跨越更多页面,你可能在查找中有几毫秒的差异,但我认为将它与创建的表关联起来更有意义[UserID]并且名称相似。也就是说,你可以做到。

答案 1 :(得分:0)

如果Profiles的PK是Users的FK,我会保持一致性并使用Users作为数据库中其他关系中的父表。

但是,如果它是真正的一对一而不是一对一或一对一的关系,则没关系。

另一个考虑因素是如何通过任何应用程序访问此数据库中的数据。应用程序是否使用OR / M类实体框架,它知道FK关系?如果是这样,请考虑使用具有列的表,这些列最常通过基于子表的查询来访问。例如,应用程序可能会在所有位置显示Profiles.LastNameProfiles.FirstName,并且很少从Users表中读取任何内容。在这种情况下,您将通过在Profiles表之外建立关系来为数据库保存一些I / O并为开发人员保存一些按键。