2014-10-30 69 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)

  • 創建和修改字段的默認值。我想創建具有當前日期的默認值,而修改的,我想對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 CONSTRAINThttp://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在沒有逗號的情況下無效。我不確定這是否記錄在任何地方,但ADOdb文檔頁面上的PostgreSQL示例在語句前面顯示逗號。

所以,你的字段定義和約束應該是這樣的:

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

而且幾個建議:

  • 遵循的命名約定由 concrete5核心設置數據庫表和列。通過探索核心數據庫表,您可以很容易地找出這些問題。
    • CamelCaseFormat中的表名(注意起始大寫字母)。此規則只有 的例外是BlockType表(從bt開始)和AttributeType表 (從at開始)。
    • 按照核心約定命名主鍵名稱。例如。 Collections表的主鍵爲cIDFiles表的主鍵爲fID。 嘗試避免命名字段時可能與核心主鍵衝突,例如 而不是使用「cID」作爲你的分類表的名稱,使用「catID」就像你已經建議的 。
    • 在字段名稱 中使用camelCaseFormat(注意較低的起始字母),就像混凝土中的任何其他表一樣。
  • 始終以包格式在CamelCased格式中爲數據庫表名添加前綴。 例如如果你的包的把手是「通知」中,您將創建數據庫表 命名NotificationsTableName

遵循這些約定讓你的代碼乾淨,可以輕鬆閱讀任何可能的未來的開發人員已經熟悉concrete5和可探討您的代碼。雖然你不同意所有的約定,但最好遵循它們,而不是讓每個開發者每次重新發明輪子。