2016-11-18 7 views
2

Я пытаюсь использовать Liquibase для нашего проекта. В основном мы используем базу данных Oracle и некоторую другую базу данных реже. Я пытаюсь понять, как указать порядок столбцов в случае индексов. Ниже приведен типичный набор изменений индекса.Liquibase createIndex column order

<createIndex indexName="PK_xxxxxxx" tableName="xxxxx" unique="true"> 
    <column name="column_1"/> 
    <column name="column_2"/> 
    <column name="column_3"/> 
</createIndex> 

Когда дело доходит до производительности и масштабируемости приложений, порядок столбцов в индексе имеет большое значение. Можете ли вы, пожалуйста, направить меня, если есть способ указать это при создании индекса?

PS: В соответствии с документацией тега столбца атрибуты afterColumn, position существуют, и они применимы только для таблицы create. Вот что говорит об этом документация.

Если этот параметр используется в команде «addColumn», этот атрибут позволяет вам контролировать, где в столбце таблицы указывается, что находится новый столбец. Допускается только один из следующих столбцов, после окончания или места. С 3,1

+0

Документация вы цитируете ссылается на команду "addColumn". Вы используете команду createIndex. –

+0

@PeterHenell Да, во время создания таблицы порядок столбцов разрешен с использованием атрибутов «AfterColumn» или «Position». Мне было интересно, можно ли использовать его вместе с «CreateIndex». –

+0

@a_horse_with_no_name, Спасибо. Обычно XML «меньше», означает, что если я использую другие стандартные инструменты для обработки XML при создании этих XML-файлов, нет никакой гарантии, что столбцы будут оставаться в порядке. Это была причина этого вопроса. –

ответ

1

LiquiBase будет использовать порядок столбцов, перечисленных в createIndex теге - очень похоже на СУБД используется порядок, указанный в заявлении create index.

Следующая ревизия:

<changeSet author="arthur" id="1"> 
    <createTable tableName="foo"> 
    <column name="col_1" type="integer"/> 
    <column name="col_2" type="integer"/> 
    <column name="col_3" type="integer"/> 
    </createTable> 
    <createIndex indexName="ix_one" tableName="foo"> 
    <column name="col_1"/> 
    <column name="col_2"/> 
    <column name="col_3"/> 
    </createIndex> 
    <createIndex indexName="ix_two" tableName="foo"> 
    <column name="col_3"/> 
    <column name="col_2"/> 
    <column name="col_1"/> 
    </createIndex> 
    <createIndex indexName="ix_three" tableName="foo"> 
    <column name="col_2"/> 
    <column name="col_3"/> 
    <column name="col_1"/> 
    </createIndex> 
</changeSet> 

будет производить следующие утверждения (когда, например, работать с updateSQL):

CREATE TABLE public.foo (col_1 INT, col_2 INT, col_3 INT); 

CREATE INDEX ix_one ON public.foo(col_1, col_2, col_3); 

CREATE INDEX ix_two ON public.foo(col_3, col_2, col_1); 

CREATE INDEX ix_three ON public.foo(col_2, col_3, col_1); 
+0

Привет, я тестировал его раньше. Хотя ликбаза уважает порядок элементов, другие инструменты обработки XML этого не делают. Например, я использую python для создания XML-данных, которые будут использоваться для ликбазы. Стандартная библиотека манипуляций с XML-интерфейсом python не соответствует синтаксическому анализу «STRICT», вместо этого пытается сортировать теги по алфавиту. Это проблема для меня. Может быть в будущих версиях, также будет атрибут, такой как позиция для создания индекса, который должен решить эту проблему. Еще раз спасибо за помощь и разъяснения. –

+0

Ну, те «другие инструменты обработки XML», которые вы используете, являются ошибками. Порядок элементов в XML *** имеет значение ***. Вы даже можете определить порядок _required_ в XML-схеме (XSD) - это было бы невозможно, если это не было связано с XML –

+0

Это частично верно. порядок в XML имеет значение только в том случае, если XSD говорит об этом. Если нет, для обычного XML порядок не имеет значения. Вот ссылка для такого обсуждения. [Делает-XML-Care-о-порядок-оф-элементов] (http://stackoverflow.com/questions/4328867/does-xml-care-about-the-order-of-elements) –