如何将此列设为唯一列

时间:2015-09-23 07:16:34

标签: sql sql-server erd

我有很多应用程序。每个应用程序可以分配多种语言。 对于每种语言,都可以有很多翻译。

每个翻译都有Key列,这是主键。

当2个应用程序使用Key = "AdminAreaTitle"创建翻译时,将出现重复的键异常。我知道这很少会发生。但是获得另一个应用程序拥有此密钥的异常已经听起来非常糟糕的用户体验。

我想要的是每个应用程序的翻译密钥,因此翻译的主键是Key,我猜ApplicationName

你如何扩展设计以获得这种行为?

删除了错误的图片!

更新

现在这是关于表/关系而不是实体框架视图的sql视图了。

使用代理键

enter image description here

更新2

使用自然键

我必须说我更喜欢这种ERD,因为它更易于设计和思考。代理关键更令人不安。

enter image description here

更新3

我创建了一个包含3个表的新数据库,所有自然键都可以看到屏幕截图,但我不断收到来自sql management studio的错误消息:

enter image description here

3 个答案:

答案 0 :(得分:1)

您显示的ERD已损坏,因为您显示的表格中包含主键及其关系(1:n,n:m)且这些表格不匹配。应用程序和语言的关键建议1:n,但您的图形标记为n:m。

你现在可能拥有的是(PK粗体):

  • 申请( app_name
  • application_language( app_name,iso_lang
  • 翻译(键,iso_lang ,文字)

但是您希望每个应用程序都定义自己的文本,因此将app_name添加到您的复合PK中以用于翻译表。

  • 申请( app_name
  • application_language( app_name,iso_lang
  • 翻译(密钥,app_name,iso_lang ,文字)

答案 1 :(得分:0)

在ER模型中,您的数据库用两个表(应用程序)和(语言)描述,并且它们之间存在关系(翻译)(实体是"名词",关系是"动词"。)

在真正的DBMS中,关系是一个表,其中包含某个应用程序的两个主键,这两个主键是以某种语言翻译的(以及其他适当的特征),使得该关系具有唯一性(应用程序)可以翻译成多种语言,一种语言可以翻译许多应用程序,但一个应用程序只能用法语翻译一次。)

APPLICATION
AppName (PK)
...

LANGUAGE
LangName (PK)
...

TRANSLATE
AppName   (PK)
LangName  (PK)
...

答案 2 :(得分:0)

您应该存储应用程序和语言之间关系的标识,而不是将语言存储在转换表中。这样,翻译对于该应用程序的语言而言是唯一的,而不仅仅是语言。

由于应用程序名称似乎可能会更改(不是在意义上,而是在描述方式),我建议您使用数字键。

类似的东西:

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)