Как установить несколько внешних ключей в наборах изменений в liquibase? - PullRequest
0 голосов
/ 29 октября 2019

У меня есть таблица соединения из двух таблиц, из которых одна имеет id в качестве первичного ключа, а другая имеет 3 столбца в качестве первичного ключа, в основном составной первичный ключ. Теперь, в таблице соединений, на какой столбец я должен ссылаться или, точнее, на то, как ссылаться на несколько столбцов как на внешний ключ при написании наборов изменений.

Вот таблицы:

<changeSet id="Create X table">
 <createTable tableName="X">
  <column name="SERVICE" type="VARCHAR(50)">
    <constraints primaryKey="true"/>
  </column>
  <column name="ACTION" type="VARCHAR(50)">
    <constraints primaryKey="true"/>
  </column>
  <column name="TARGET" type="VARCHAR(50)">
    <constraints primaryKey="true"/>
  </column>
 </createTable>
</changeSet>

Вторая таблица:

<changeSet id="Create Y table">
<createTable tableName="Y">
  <column name="ID" type="VARCHAR(36)">
    <constraints primaryKey="true" primaryKeyName="XPKY"/>
  </column>
  <column name="NAME" type="VARCHAR(50)">
    <constraints nullable="false" unique="true"/>
  </column>
</createTable>

Объединенная таблица:

 <changeSet id ="Create X_Y_REL table">
<createTable tableName="X_Y_REL">
  <column name="Y_NAME" type="VARCHAR(50)">
    <constraints nullable="false" referencedTableName="Y" referencedColumnNames="NAME"
                 foreignKeyName="XFK1X_Y_REL"/>
  </column>
  <column name="X_ID" type="VARCHAR(150)">
    <constraints nullable="false" referencedTableName="X" referencedColumnNames="?????"
                 foreignKeyName="XFK2_X_Y_REL"/>
  </column>
</createTable>

Итак, я не знаю, что здесь указать в качестве имени столбца, на который есть ссылка, поскольку в таблице X нет ни одного столбца первичного ключа. Это 'первичный ключ - составной ключ.

Есть предложения?

1 Ответ

0 голосов
/ 29 октября 2019

Это больше вопрос проектирования базы данных, чем вопрос Liquibase, но вот мои мысли по этому поводу.

Вероятно, вам следует просто добавить один столбец целого числа или UUID в каждую таблицу, чтобы использовать его в качестве суррогатного первичного ключа. В конечном итоге это облегчит вам и всем, кто придет за вами. Затем всегда используйте этот ключ в качестве отношения внешнего ключа.

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

Если вы не хотите добавлять суррогатный первичный ключ, то в своем третьем наборе изменений вы можете ссылаться на несколько имен столбцов, составляющих составной ключ, разделяя их запятыми. Это будет выглядеть так:

<changeSet id ="Create X_Y_REL table" author="Steve">
   <createTable tableName="X_Y_REL">
     <column name="Y_NAME" type="VARCHAR(50)">
       <constraints nullable="false" referencedTableName="Y" referencedColumnNames="NAME"
                    foreignKeyName="XFK1X_Y_REL"/>
     </column>
     <column name="X_ID" type="VARCHAR(150)">
       <constraints nullable="false" referencedTableName="X" referencedColumnNames="SERVICE,ACTION,TARGET"
                    foreignKeyName="XFK2_X_Y_REL"/>
     </column>
  </createTable>
</changeSet>
...