2014-10-30 4 views
0

Я разрабатываю пакет для Concrete5, который использует формат AXMLS для указания схемы базы данных.Схема базы данных AXMLS - значения по умолчанию и внешние ключи

http://www.concrete5.org/documentation/how-tos/developers/creating-and-working-with-db-xml-files/

Вот схема:

<?xml version="1.0"?> 
<schema version="0.3"> 
    <table name="notificationCategory"> 
     <field name="id" type="I"> <!-- integer --> 
      <key/> 
      <autoincrement/> 
     </field> 

     <field name="name" type="C" size="255"> <!-- varchar(255) --> 
     </field> 

     <field name="created" type="T"> 
      <deftimestamp/> 
     </field> 

     <field name="modified" type="T"> 
     </field> 

     <opt> 
      Type=InnoDB 
     </opt> 
    </table> 

    <table name="notificationEntry"> 
     <field name="id" type="I"> <!-- integer --> 
      <key/> 
      <autoincrement/> 
     </field> 

     <field name="name" type="C" size="255"> <!-- varchar(255) --> 
     </field> 

     <field name="cat_id" type="I"> 
     </field> 

     <constraint> 
      ADD CONSTRAINT `cat_id_ibfk_1` FOREIGN KEY (`cat_id`) REFERENCES `notificationCategory`.(`id`) ON DELETE CASCADE 
     </constraint> 

     <opt> 
      Type=InnoDB 
     </opt> 
    </table> 
</schema> 

Я борюсь с двумя вещами:

  • внешних ключей. Результатом следующего является таблица NotificationEntry, где внешний ключ не устанавливается (используется InnoDB)

  • Значения по умолчанию для созданного и измененного поля. Я хочу создан, чтобы иметь значение по умолчанию текущей даты, в то время как для модифицированного я хотел бы иметь ON UPDATE CURRENT_TIMESTAMP

     show create table notificationCategory; 
    
        CREATE TABLE `notificationCategory` (
        `id` int(11) NOT NULL AUTO_INCREMENT, 
        `name` varchar(255) DEFAULT NULL, 
        `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
        `modified` datetime DEFAULT NULL, 
        PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 
    

Существует очень мало документации для этого формата, разве кто имеет успех, используя Это?

ответ

1

Согласно документации MySQL, вы не используете ADD CONSTRAINT, когда вы создаете таблицу: http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

Во-вторых, все <constraint> определения должны быть внутри <field> определений согласно ADOdb документации: http://adodb.sourceforge.net/docs-datadict.htm

Дополнительные ограничения определены в конце определения поля.

В-третьих, определение ограничения должно запятой перед ним, потому что он объединяется в конце CREATE TABLE блока таким образом, генерируется MySQL будет недействительным без запятой. Я не уверен, что это документировано где угодно, но пример PostgreSQL на странице документации ADOdb показывает запятую перед заявлением.

Таким образом, ваше определение поля и ограничение должно выглядеть следующим образом:

<field name="catID" type="I"> 
    <constraint> 
    , FOREIGN KEY (catID) REFERENCES NotificationsNotificationCategory(catID) ON DELETE CASCADE 
    </constraint> 
</field> 

И еще несколько советов:

  • Выполните соглашения об именах для таблиц базы данных и столбцов, установленных сердечника concrete5 , Вы можете легко понять их, изучив основные таблицы базы данных.
    • Названия таблиц в CamelCaseFormat (обратите внимание на стартовую заглавную букву). Только исключения из это правило являются таблицами BlockType (начиная с bt) и таблиц AttributeType (начиная с at).
    • Назовите свои имена первичных ключей, следуя основным соглашениям. Например. первичный ключ для стол Collections - cID, а первичный ключ для стола Files - fID. Старайтесь избегать возможных конфликтов с основными первичными ключами при наименовании ваших полей, , например. вместо того, чтобы использовать «cID» в качестве названия для вашей таблицы категорий, используйте «catID», как вы уже указывали .
    • Используйте camelCaseFormat (обратите внимание на нижнюю стартовую букву) также в именах полей , как и любой другой стол в бетоне5.
  • Всегда префикс имен таблиц базы данных с помощью дескриптора пакета в формате CamelCased. . если ручка ваш пакет является «уведомления», вы можете создать таблицы базы данных имени NotificationsTableName

После этих конвенций сохраняет свой код в чистоте и позволяет легко считывать для любых возможных будущих разработчиков, которые уже знакомы с concrete5 и может изучить код , Хотя вы не согласны со всеми соглашениями, лучше следовать им, чем позволить каждому разработчику изобретать велосипед каждый раз.