如何在数据库中建模IsPrimaryPhone字段?

时间:2017-10-26 20:27:38

标签: sql-server database-design

联系人可以拥有一个或多个电话号码。需要一种方法将其中一个设置为"主要"电话号码。

建模的最佳方法是什么?

我通常看到的方法是简单地添加一个名为" is_primary"的字段。到手机然而,为了使其工作,当一个记录的该字段设置为true时,则需要将所有其他相关电话号码设置为false。

有没有办法通过关系对其进行建模,因此只需要更新一位数据?

这似乎可以通过名为PrimaryPhone的链接表来完成 ContactId和PhoneId。如果ContactId / PhoneId存在链接,则会在UI中使用它来显示它是主要链接。如果主要更改,则只需更改一条记录即可。

或者是否应该采取其他方式?

2 个答案:

答案 0 :(得分:1)

假设你有两个表(Contacts和PhoneNumbers),这很简单。您在ContactsPhoneNumberID的Contacts中有一列,它包含PhoneNumber的ID。这可确保您在任何一个时间点都不会有超过1个标记为主要内容。

答案 1 :(得分:0)

我可能会像我一样:

    CREATE TABLE Contact
        (ContactID int NOT NULL PRIMARY KEY
        ,CreateDate datetime
        )
    GO

    CREATE TABLE Phone
        (PhoneID int identity (1,1) PRIMARY KEY
        ,ContactID int  not null 
        ,[Key] varchar(20) not null
        ,[Value] varchar(20) not null
        ,[Status] varchar(20) not null
        )
    GO
    ALTER TABLE Phone 
    ADD CONSTRAINT FK_cnst FOREIGN KEY (ContactID)     
        REFERENCES Contact (ContactID)     
    GO
    ALTER TABLE phone ADD CONSTRAINT UX_Constraint UNIQUE (ContactID, [Status])
    GO

    INSERT contact SELECT 1, GETDATE()

    INSERT INTO phone (ContactID, [Key], Value, Status) VALUES (1, 'Office', '455-1212', 'Alternate')
    INSERT INTO phone (ContactID, [Key], Value, Status) VALUES (1, 'Home', '555-1212', 'Alternate2')
    INSERT INTO phone (ContactID, [Key], Value, Status) VALUES (1, 'Cell', '555-1000', 'Primary')
    INSERT INTO phone (ContactID, [Key], Value, Status) VALUES (1, 'Cell', '555-1001', 'MistressHotline')

    GO

    SELECT *
    FROM Phone

    GO


    DROP TABLE  phone, Contact

然后当然要查询它是否会有效。

由于