AXMLS数据库模式 - 默认值和外键

AXMLS数据库模式 - 默认值和外键

问题描述:

我正在开发一个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 
    

有这个格式提供很少的文件,有没有人使用有成功它?

按照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和可探讨您的代码。虽然你不同意所有的约定,但最好遵循它们,而不是让每个开发者每次重新发明*。