【问题标题】:Grails multi column indexesGrails 多列索引
【发布时间】:2010-12-03 09:59:51
【问题描述】:

谁能解释如何在 Grails 中定义多列索引?文档充其量是稀疏的。

例如,这似乎根本不起作用: http://grails.org/GORM+Index+definitions

我有一些运气,但结果似乎充其量是随机的。在一个域类中有效的定义在应用于另一个域类时不起作用(当然名称不同)。 http://www.grails.org/doc/1.1/guide/single.html#5.5.2.6%20Database%20Indices

我们将不胜感激一些工作示例和解释!

【问题讨论】:

    标签: database grails grails-orm indexing


    【解决方案1】:

    对我来说适用于多列索引的解决方案是:

    class ClassName {
        String name
        String description
        String state
    
        static mapping = {
            name index: 'name_idx'
            description index: 'name_idx'
            state index: 'name_idx'
        }
    }
    

    这将创建一个名为“name_idx”的索引,其中包含索引中的三列。

    缺点:索引中的列是按字母顺序列出的,而不是它们输入的顺序。

    【讨论】:

    • 有什么方法可以设置复合索引顺序?
    【解决方案2】:

    要使您的索引为多列,请使用逗号分隔符列出列(注意,逗号后没有空格,以避免this bug。您指向的第二个 URL 会遇到错误,正如它所说:

    index:'Name_Idx, Address_Index'
    

    带空格;它应该像

    index:'Name_Idx,Address_Index'
    

    您指向的第一个 URL 是一个提议的更改(我认为它目前尚未实施,也不知道它的可能性有多大)。

    【讨论】:

    • 我已经尝试过(来自参考),但运气不错。它似乎很随机地工作。适用于一张桌子的东西在另一张桌子上会产生另一种结果。索引名称的约定是什么?是否必须为另一列定义“Address_Index” - 还是 Grails 神奇地发现它必须是“地址”字段的索引?
    • @Kimble,我不认为命名有什么神奇之处(尽管文档 的实现确实令人困惑,我不能一定)。
    • 这个“没有空间”的 bug 让我很生气
    【解决方案3】:

    AFAIK,here 显示的 index 闭包从未实现,因此应忽略这些示例(此页面用于讨论可能的实现,而不是记录实际实现)。

    name 属性定义单列索引name_idx 的正确方法是

    static mapping = {
          name index:'name_idx'
    }
    

    抱歉,我不知道如何定义多列索引,如果您在这里没有得到答案,请尝试Grails mailing list。万一不能在域类中直接声明多列索引,您可以在 SQL 文件中定义它们,如果它们不存在则创建它们(或删除并重新创建它们)。这个SQL文件可以被Bootstrap.groovy中的init闭包执行

    【讨论】:

      【解决方案4】:

      我需要能够控制我的多列索引中列的顺序并使其独一无二。我通过使用直接 SQL 在 Bootstrap 中创建索引来解决 GORM / Hibernate 限制:

      class BootStrap {
      
          DataSource dataSource
      
          def init = { servletContext ->
              if (!MyModel.count()) { // new database
                  createIndexes()
                  ...
              }
          }
      
          private void createIndexes() {
              Sql sql = new Sql(dataSource)
              sql.execute("create unique index my_index on my_model(col1,col2);")
          }
      

      【讨论】:

      • 这可能更适合DB Migration 插件而不是引导程序。
      猜你喜欢
      • 2011-11-07
      • 2010-09-15
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 2020-05-06
      相关资源
      最近更新 更多