我怎样才能使这个专栏成为一个独特的专栏
How can I make this column an unique column
我有很多申请。每个应用程序都可以分配多种语言。
每种语言都可以有多种翻译。
每个翻译都有一个 Key
列作为主键。
当 2 个应用程序使用 Key = "AdminAreaTitle"
创建翻译时,将出现重复键异常。我知道这很少会发生。但是得到另一个应用程序拥有此密钥的异常听起来已经很糟糕的用户体验了。
我想要的是每个应用程序的翻译键,所以翻译的主键是 Key
,我想 ApplicationName
。
您将如何扩展设计以获得该行为?
删除了错误的图片!
更新
现在这是 tables/relations 上的 sql 视图,不再是 entity framework 视图。
使用 代理键
更新 2
WITH 自然键
我必须说我更喜欢这个 ERD,因为它更易于设计和思考。代理键更令人不安。
更新 3
我创建了一个包含 3 个表的新数据库,所有自然键见屏幕截图,但我不断收到来自 sql management studio 的错误消息:
在 E-R 模型中,您的数据库由两个 table(应用程序)和(语言)以及它们之间的关系(翻译)来描述(实体是 "nouns",关系是"verbs").
在真实的 DBMS 中,关系是一个 table,它包含被翻译成某种语言的某个应用程序的两个主键(以及翻译本身的其他特性),使得关系是唯一的(一个应用程序可能被翻译成多种语言,一种语言可以翻译许多应用程序,但一个应用程序可能只被翻译成法语一次)。
APPLICATION
AppName (PK)
...
LANGUAGE
LangName (PK)
...
TRANSLATE
AppName (PK)
LangName (PK)
...
与其将语言存储在翻译 table 中,不如存储应用程序与语言之间关系的标识。这样,翻译对于该应用程序的语言将是唯一的,而不仅仅是该语言。
由于应用程序名称似乎是可能会更改的信息(不是在含义上,而是在描述方式上),我建议您使用数字键。
类似于:
Application
ApplicationId int, identity, pk
ApplicationName nvarchar(50)
ApplicationLanguage
ApplicationLanguageId int, identity, pk
ApplicationId int
LanguageId int
Language
LanguageId int, identity, pk
LanguageName nvarchar(50)
Translation
ApplicationLanguageId int, pk
Key nvarchar(20), pk
Text nvarchar(max)
您显示的 ERD 已损坏,因为您显示 tables 及其主键加上它们的关系(1:n、n:m)并且这些不匹配。应用程序和语言的键值建议1:n,但你的图形被标记为n:m。
你现在可能拥有的是(PK 粗体):
- 申请(app_name)
- application_language (app_name, iso_lang)
- 翻译(键,iso_lang,文本)
但是您希望每个应用程序都定义自己的文本,因此将 app_name 添加到您的复合 PK 中用于翻译 table。
- 申请(app_name)
- application_language (app_name, iso_lang)
- 翻译(键,app_name,iso_lang,文本)
我有很多申请。每个应用程序都可以分配多种语言。 每种语言都可以有多种翻译。
每个翻译都有一个 Key
列作为主键。
当 2 个应用程序使用 Key = "AdminAreaTitle"
创建翻译时,将出现重复键异常。我知道这很少会发生。但是得到另一个应用程序拥有此密钥的异常听起来已经很糟糕的用户体验了。
我想要的是每个应用程序的翻译键,所以翻译的主键是 Key
,我想 ApplicationName
。
您将如何扩展设计以获得该行为?
删除了错误的图片!
更新
现在这是 tables/relations 上的 sql 视图,不再是 entity framework 视图。
使用 代理键
更新 2
WITH 自然键
我必须说我更喜欢这个 ERD,因为它更易于设计和思考。代理键更令人不安。
更新 3
我创建了一个包含 3 个表的新数据库,所有自然键见屏幕截图,但我不断收到来自 sql management studio 的错误消息:
在 E-R 模型中,您的数据库由两个 table(应用程序)和(语言)以及它们之间的关系(翻译)来描述(实体是 "nouns",关系是"verbs").
在真实的 DBMS 中,关系是一个 table,它包含被翻译成某种语言的某个应用程序的两个主键(以及翻译本身的其他特性),使得关系是唯一的(一个应用程序可能被翻译成多种语言,一种语言可以翻译许多应用程序,但一个应用程序可能只被翻译成法语一次)。
APPLICATION
AppName (PK)
...
LANGUAGE
LangName (PK)
...
TRANSLATE
AppName (PK)
LangName (PK)
...
与其将语言存储在翻译 table 中,不如存储应用程序与语言之间关系的标识。这样,翻译对于该应用程序的语言将是唯一的,而不仅仅是该语言。
由于应用程序名称似乎是可能会更改的信息(不是在含义上,而是在描述方式上),我建议您使用数字键。
类似于:
Application
ApplicationId int, identity, pk
ApplicationName nvarchar(50)
ApplicationLanguage
ApplicationLanguageId int, identity, pk
ApplicationId int
LanguageId int
Language
LanguageId int, identity, pk
LanguageName nvarchar(50)
Translation
ApplicationLanguageId int, pk
Key nvarchar(20), pk
Text nvarchar(max)
您显示的 ERD 已损坏,因为您显示 tables 及其主键加上它们的关系(1:n、n:m)并且这些不匹配。应用程序和语言的键值建议1:n,但你的图形被标记为n:m。
你现在可能拥有的是(PK 粗体):
- 申请(app_name)
- application_language (app_name, iso_lang)
- 翻译(键,iso_lang,文本)
但是您希望每个应用程序都定义自己的文本,因此将 app_name 添加到您的复合 PK 中用于翻译 table。
- 申请(app_name)
- application_language (app_name, iso_lang)
- 翻译(键,app_name,iso_lang,文本)