假设您有一些非常大(100k +)的可用对象,并且可以提供20多种语言的数据(例如名称)。什么是在SQL数据库中存储/处理此数据的有效方法。
显而易见的方法就是这样 - 但是,还有其他更有意义的方法吗?我有点担心表现。
CREATE TABLE "object" (
"id" serial NOT NULL PRIMARY KEY
);
CREATE TABLE "object_name" (
"object_id" integer NOT NULL REFERENCES "object" ("id")
"lang" varchar(5) NOT NULL,
"name" varchar(50) NOT NULL
);
至于用法,使用只会选择一种语言,这会导致object_name
表上的联接可能很大。
是否过早优化,我对其他方法感兴趣,如果只是获得一些安心,明显的解决方案不是一个非常愚蠢的解决方案。
澄清实际模型的方式更复杂。这只是到目前为止确定的模式。
答案 0 :(得分:3)
如果(object_id, lang)
上有一个组合键,则不应该有任何连接,只需要O(1)查找,对吧? (请尝试使用EXPLAIN SELECT
确认)
答案 1 :(得分:2)
在我自己的项目中,我不会在数据库级别进行翻译。我让用户(或操作系统)给我一个lang代码,然后我将所有文本一次加载到哈希中。然后,DB会向我发送该哈希的ID,并在我将其显示在某处时翻译文本。
请注意,我的ID也是字符串。这样,您可以看到您正在使用哪个文本(将“USER”与“136”进行比较 - 谁知道“136”在UI中可能意味着什么,而无需查看数据库?)。
[编辑]如果您无法在UI级别进行翻译,那么您的数据库设计是您可以瞄准的最佳设计。它尽可能小,易于索引和连接不需要太多。
如果你想更进一步,你可以在应用程序级别生成SQL查询,你可以考虑创建视图(每种语言一个),然后使用连接中的视图,这将给你一个方法避免双列连接。但我怀疑这种复杂的方法会带来积极的投资回报率。
答案 2 :(得分:0)
您是否考虑过使用多个表格,每种语言一个?
在编码复杂性方面会花费更多,但是你将只为每种语言加载/访问一个表,其中元数据将更小,因此更节省时间(可能也是空间方式,因为你赢了'每行都有一个“lang”变量
另外,如果你真的想要一个表到规则 - 全部,你可以创建一个视图并加入它们:)
答案 3 :(得分:0)
除了Wim所写的内容之外,你案例中的表OBJECT也没用。不需要这样的表,因为它不存储表OBJECT_NAME中未包含的任何单个信息。