我知道这不是完全正常化的,但是将我的应用程序中的所有本地化数据整合到几个表中将会帮助我很多。
我必须能够将一些通用表链接到LocalisedContent表,该表将包含连接到它的通用表的每个本地化键值对的不同行...我想你可以说它将是一对多的关系。
我发现的问题是我不确定如何最好地模拟这个...我可以想到两种方式,我不确定哪种方式最好:
我的第一个选择是:
AnExampleOfAGenericTable
------------
AnExampleOfAGenericTableID
...other non-localised data...
AnotherGenericTable
------------
AnotherGenericTableID
...other non-localised data...
LocalisedContent
----------------
LocalisedContentID
genericTablePKName
GenericTableID
LanguageID
field
content
在上面的内容中,可以通过SQL查询获取通用表的本地化内容,如:
SELECT AnExampleOfAGenericTableID, field, content
FROM AnExampleOfAGenericTable LEFT JOIN LocalisedContent
ON AnExampleOfAGenericTable.AnExampleOfAGenericTableID =
LocalisedContent.GenericTableID
WHERE genericTablePKName = 'AnExampleOfAGenericTableID'
或者:
SELECT AnotherGenericTableID, field, content
FROM AnotherGenericTable LEFT JOIN LocalisedContent
ON AnotherGenericTable.AnotherGenericTableID = LocalisedContent.GenericTableID
WHERE genericTablePKName = 'AnotherGenericTableID'
第二种选择似乎是:
AnExampleOfAGenericTable
------------
AnExampleOfAGenericTableID
...other non-localised data...
localisedGroupID
AnotherGenericTable
------------
AnotherGenericTableID
...other non-localised data...
localisedGroupID
LocalisedContent
----------------
LocalisedContentID
localisedGroupID
LanguageID
field
content
然后我可以使用SQL查询,如:
SELECT AnExampleOfAGenericTableID, field, content
FROM AnExampleOfAGenericTable LEFT JOIN LocalisedContent
ON AnExampleOfAGenericTable.localisedGroupID = LocalisedContent.localisedGroupID;
或者:
SELECT AnotherGenericTableID, field, content
FROM AnotherGenericTable LEFT JOIN LocalisedContent
ON AnotherGenericTable.localisedGroupID = LocalisedContent.localisedGroupID;
第二种选择对我来说似乎更简洁,但它确实需要我加入两个看似有点奇怪的FK。它还需要大量额外的“localisedGroupID”列。
最终我给出的两个例子都可能是错的,我没有专业知识来了解最佳解决方案。 (在你指出这没有完全规范化之前,我已经说过我不希望每个表都有数百个不同的本地化数据表......我确实希望对本地化进行一定程度的集中化,即使它会失去一点参考诚信。)
想法?
答案 0 :(得分:1)
您的架构让我想起了网络上可用的“泛化专业化关系建模”示例,但有一个重要区别。
你所谓的AnExampleOfAGenericTable和AnotherGenericTable对应于gen-spec模式中的专用表,你所调用的LocalisedContent对应于gen-spec模式中的通用表。
如果我理解你,前两个表中的每个条目都将在LocalisedContent表中具有对应项,但LocalisedContent表中的条目将仅在其他两个表中的一个中具有对应项。这与gen-spec完全相同,只是倒退。
在gen-spec设计中,您在通用表中使用的所有专用表中使用相同的PK。但是,专用表中的PK也是广义表的FK。当然,您只在gen表中使用自动编号功能。
没有什么关于gen-spec的非正常化。
答案 1 :(得分:0)
我们使用以下内容:
LocalizedContent:
Id - identity
Key - format 'TableName.ColumnName'
Value - localized value
LanguageId - reference to the languageid
TableRowId - generic table row id
格式为'TableName.ColumnName'的键的位置
用法:
SELECT IFNULL(lc1.Value, name) as Name,
IFNULL(lc2.Value, Description) as Description
From GenericTable t
LEFT JOIN LocalizedContent lc1
ON (lc1.TableRowId = t.Id AND Key = 'GenericTable.Name' And LanguageID = YourLangId)
LEFT JOIN LocalizedContent lc2
ON (lc2.TableRowId = t.Id AND Key = 'GenericTable.Description' And LanguageID = YourLangId)
GenericTable是(Id,Name,Description)