我需要创建一些查找表,我经常看到以下内容:
create table Languages
(
Id int identity not null primary key (Id),
Code nvarchar (4) not null,
Description nvarchar (120) not null,
);
create table Posts
(
Id int identity not null primary key (Id),
LanguageId int not null,
Title nvarchar (400) not null,
);
insert into Languages (Id, Code, Description) values (1, "en", "English");
这样我就用语言ID本地化帖子了......
恕我直言,这不是语言表的最佳方案,因为在查找表中PK应该是有意义的,对吗?
所以我会使用以下内容:
create table Languages
(
Code nvarchar (4) not null primary key (Code),
Description nvarchar (120) not null,
);
create table Posts
(
Id int identity not null primary key (Id),
LanguageCode nvarchar (4) not null,
Title nvarchar (400) not null,
);
insert into Languages (Code, Description) values ("en", "English");
NET应用程序通常使用语言代码,这样我就可以在不使用Join的情况下使用英语发布帖子。
通过这种方法,我也在维护数据库数据的完整性......
这可以应用于Genders表,代码为“M”,“F”,国家表,交易类型表(我应该吗?),...
但是我认为在查找表中使用int作为PK是很常见的,因为它更容易映射到ENUMS。
并且知道甚至可以映射到标记枚举,因此在ENUM中有多对多的关系。
这对.NET代码有帮助,但实际上有局限性。语言表永远不能映射到FLags Enum ...
...标志枚举不能超过64个项目(Int64),因为键必须是2的幂。
解决方案
我决定找到一种强制数据库数据完整性的方法,并且仍然可以使用枚举,所以我尝试了:
create table Languages
(
Code nvarchar (4) not null primary key (Code),
Key int not null,
Description nvarchar (120) not null,
);
create table Posts
(
Id int identity not null primary key (Id),
LanguageCode nvarchar (4) not null,
Title nvarchar (400) not null,
);
insert into Languages (Code, Key, Description) values ("en", 1, "English");
使用这种方法,我有一个有意义的语言代码,我避免连接,我可以通过解析密钥创建一个枚举:
public enum LanguageEnum {
[Code("en")
English = 1
}
我甚至可以保存属性中的代码。或者我可以切换代码和说明......
旗帜枚举怎么样?好吧,我没有Flag枚举,但我可以有List ...
使用List时,我没有64项限制......
对我而言,这一切都有意义,但我会将其应用于Roles表或ProductsCategory表吗?
在我看来,我只适用于很少随时间变化的表......所以:
Languages, Countries, Genders, ... Any other example?
关于以下内容我不确定(它们是应用程序固有的):
PaymentsTypes, UserRoles
对于这些我不会申请(他们可以由CMS管理):
ProductsCategories, ProductsColors
您如何看待我的查找表方法?
答案 0 :(得分:1)
第一种方法是正确的,ID为PK。 (您还可以在“代码”列上设置唯一索引。)
' PK应该有意义,对吧?'
不。这不是必要条件;多年来我在DBMS工作中从未听说过它。
请记住,大多数RDBMS'对int键进行优化,并且比大多数其他数据类型更快地查找和整数PK。这就是为什么IDENTITY被用于这么多PK的原因之一。