我有一个记录,其中包含2个许可证“密钥”(实际上是GUID)。当请求到达我们的服务时,它在请求中包含密钥(GUID)。然后我查询在Key1或Key2列中查找具有此值的记录。
这样做的目的是用户将使用Key1的一切。然后他们发现Key1已经公开。因此,他们切换到Key2,然后在15分钟后,更改Key1的值。现在旧的Key1值没用。
通过使用2个按键,它可以在没有停机的情况下进行切换。
我需要任何键值是唯一的。并不是说任何一对值都是唯一的。并非Key1中的值在Key 1的所有行中都是唯一的。但是,所有rows.Key1和rows.Key2中的新值都是唯一的。
有没有办法在Sql Server中强制执行此操作。或者在进行插入或更新之前,我是否需要自己选择?
-------------------------------------------------------------------------------------------
| LicenseId | ApiKey1 | APiKey2 |
| 1 | af53d192-7fa3-4be0-b3d4-7efe17a397b5 | 1a87cc4a-1941-4af7-aeaa-bf9690f47eef |
| 2 | 5bbc2d06-ed6f-4444-aa22-73820dd6f3f6 | c2bdd9d9-fd47-4727-83f8-02ed0e7537e1 |
| 3 | 8acfa8b4-aa4b-41a7-9d3d-b6ba1eac838e | 30c18f2d-5d89-4e5d-8e8e-2d2b647d6ab6 |
-------------------------------------------------------------------------------------------
我需要确保我是否要创建记录LicenseId = 4,如果它有ApiKey2 ='af53d192-7fa3-4be0-b3d4-7efe17a397b5',则插入将失败,因为对于LicenseId = 1,guid是ApiKey1。
在数据库中强制执行此操作的最自然方法是将所有键放在单个列中。例如
create table ApiKeys
(
LicenceId int,
KeyId int check (KeyId in (0,1)),
constraint pk_ApiKeys primary key (LicenceId,KeyId),
KeyGuid uniqueidentifier unique
)
可以说,同一行上的两个键都违反了1NF,当然,你对两列唯一性的渴望强烈暗示它们属于一个域。
因此,不是将ApiKey1和ApiKey2存储在同一行上,而是将它们存储在两个单独的行上。
而不是
---------------
| LicenseId | ApiKey1 | APiKey2 |
| 1 | af53d192-7fa3-4be0-b3d4-7efe17a397b5 | 1a87cc4a-1941-4af7-aeaa-bf9690f47eef |
| 2 | 5bbc2d06-ed6f-4444-aa22-73820dd6f3f6 | c2bdd9d9-fd47-4727-83f8-02ed0e7537e1 |
| 3 | 8acfa8b4-aa4b-41a7-9d3d-b6ba1eac838e | 30c18f2d-5d89-4e5d-8e8e-2d2b647d6ab6 |
-------------------------------------------------------------------------------------------
你将会拥有:
----------------------------------------------------------
| LicenseId | KeyId | ApiKey |
| 1 | 0 | af53d192-7fa3-4be0-b3d4-7efe17a397b5|
| 1 | 1 | 1a87cc4a-1941-4af7-aeaa-bf9690f47ee4|
| 2 | 0 | 5bbc2d06-ed6f-4444-aa22-73820dd6f3f6|
| 2 | 1 | c2bdd9d9-fd47-4727-83f8-02ed0e7537e1|
| 3 | 0 | 8acfa8b4-aa4b-41a7-9d3d-b6ba1eac838e|
| 3 | 1 | 30c18f2d-5d89-4e5d-8e8e-2d2b647d6ab6|
----------------------------------------------------------