【发布时间】:2015-09-24 02:56:50
【问题描述】:
我有很多应用程序。每个应用程序都可以分配多种语言。 每种语言都可以有多种翻译。
每个翻译都有一个Key 列,它是主键。
当 2 个应用程序使用 Key = "AdminAreaTitle" 创建翻译时,将出现重复键异常。我知道这很少会发生。但是,如果另一个应用程序具有此密钥的异常情况已经听起来很糟糕的用户体验。
我想要的是每个应用程序的翻译键,所以翻译的主键是Key,我猜是ApplicationName。
您将如何扩展设计以获得该行为?
删除了错误的图片!
更新
现在这是表/关系上的 sql 视图,不再是实体框架视图。
带有代理键
更新 2
带有自然键
我必须说我更喜欢这个 ERD,因为它更易于设计和思考。代理键更令人不安。
更新 3
我创建了一个包含 3 个表的新数据库,所有自然键见截图,但我不断收到来自 sql management studio 的错误消息:
【问题讨论】:
-
对于一对多和多对多关系,您可以创建第三个表,将两个表的主键引用为第三个表中的外键。
-
这似乎太多了。为什么不在 Translation Table 中创建一个 FK_ApplicationName 引用 Application 表。然后这个 FK 是一个复合 PK(Key 和 ApplicationName 字段)?
-
您在这里混合了两件事:关系的图形表示(n m,1 n)和带有主键的表描述。你不能这样做。使用两种表示中的任何一种,而不是两者的混合。如果 name 是应用程序的 PK,iso639 是语言的 PK,那么这将是 1:n 关系。但是,当您将 n:m 放在那里时,显然缺少一些东西,即 shubham agiwal 建议实现 n:m 的桥接表。
-
是的,桥表丢失了,因为这是一个实体框架模型,再次为您的困惑感到抱歉。
-
我也更喜欢第二张图。但是,ApplicationLanguage 和 Translation 之间没有联系,我认为这是缺乏的。并且:ISO639 必须是 Translation PK 的一部分,否则每个应用程序和密钥只能使用一种语言,我认为这是没有意义的。 (这不是应用程序+键+语言,您需要获取文本吗?如果只是应用程序和键,那么您的程序将需要知道哪个键用于英语,哪个用于西班牙语等)
标签: sql sql-server erd