【问题标题】:How to use multilanguage database schema with ORM?如何在 ORM 中使用多语言数据库模式?
【发布时间】:2011-03-05 20:57:43
【问题描述】:

美好的一天!

我正在寻找实现多语言数据库架构的最佳方法,我使用的方法与此处相同:What are best practices for multi-language database design?(一张包含语言中性数据的表,一张用于所有翻译)。它看起来既好又干净,并且不限制可能的语言数量。

但我想使用一个简单的 ORM(如 C# 中的 LINQ、PHP 的 Outlet 等),其中每个表都映射到实体类。这可以工作,但查询变得更加复杂。

可能有一些特殊的技术可以将这种 DB shema 与 ORM 一起使用?或者我可以从支持更复杂映射的更复杂的 ORM 中受益?

提前致谢!

【问题讨论】:

    标签: database orm multilingual


    【解决方案1】:

    对所有翻译仅使用一个表可能会很快导致任何操作(选择/插入/更新/删除)出现严重的性能和复杂性问题;试着理解我的意思。

    然后我会采用以下方法(每个“可翻译”对象两个表),这似乎在性能、复杂性和维护问题之间取得了很好的平衡。

    product
      - id (PK)
      - number1
      - number2
      - date1
      - date2
      ...
    
    product_i18n
      - id (PK)
      - product_id (FK)
      - language_id (FK)
      - string1
      - string2
      ...
    
    language
      - id (PK)
      - name
    

    检查它是如何使用 Propel ORM (PHP) 完成的:http://propelorm.org/blog/2011/01/11/propel-gets-i18n-behavior-and-why-it-matters.html

    HTH

    【讨论】:

    • 谢谢,我使用相同的数据库方案,但不幸的是我使用的 ORM(.NET 上的 LINQ2SQL 和 PHP 的 Outlet)不直接支持这种情况。我一定会调查 Propel。
    • 在这种情况下你会如何做回退?
    • 为什么需要后备?
    • 在首选语言不存在的情况下需要后备。我们使用(最多)两次查找来完成此操作:如果第一次查找未发现任何内容,则为产品选择最旧的时间戳语言。
    • 好吧,我不明白这里的'fallback'的意思。我猜想<tablename>_i18n 中的第一个查询将是必要的,以检查是否存在具有已翻译值的行。但是,当检索到大量数据时应该避免这种情况,因为这可能会很快导致性能问题。然后,我建议为所有要检索的行选择一次语言 + 执行一个简单的 LEFT JOIN,如果没有可用的翻译,它将返回 NULL 值,因为这样会减少对性能的影响。
    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2011-02-01
    相关资源
    最近更新 更多