【发布时间】:2011-08-20 00:53:59
【问题描述】:
我目前正在开发一个可自定义表单脚本,我的用户将能够在他们的自定义表单中创建新字段。
如何为它制作一个MySQL表结构?如果你知道 YAML 会有所帮助吗?
【问题讨论】:
标签: php mysql yaml custom-fields
我目前正在开发一个可自定义表单脚本,我的用户将能够在他们的自定义表单中创建新字段。
如何为它制作一个MySQL表结构?如果你知道 YAML 会有所帮助吗?
【问题讨论】:
标签: php mysql yaml custom-fields
粗略的轮廓...
这是一个简单的架构,基于一个用户拥有多个表单,一个表单拥有多个字段。当然,您可以在这些建议的字段中添加字段,实际上唯一必要的字段是以“_id”结尾的字段。
【讨论】:
User:
columns:
user_id: { type: integer, primary: true, notnull: true }
email: { type: string(80) }
password: { type: string(80) }
Form:
columns:
form_id: { type: integer, primary: true, notnull: true }
user_id: { type: integer, notnull: true }
title: { type: string(80) }
is_active: { type: boolean, notnull: true, default: 1 }
relations:
User: { onDelete: CASCADE, local: user_id, foreign: user_id, foreignAlias: Forms }
Field:
columns:
field_id: { type: integer, primary: true, notnull: true }
form_id: { type: integer, notnull: true }
field_name: { type: string(80) }
field_type: { type: enum, values: [ String, Integer, Float, LongText, Boolean] }
field_value: { type: string(80) }
relations:
Form: { onDelete: CASCADE, local: form_id, foreign: form_id, foreignAlias: Fields }
以上YAML生成的MySQL数据库:
创建表
field(field_idbigint(20) NOT NULL DEFAULT '0',form_idbigint(20) NOT NULL,field_namevarchar(80) DEFAULT NULL,field_typeenum('String','Integer','Float','LongText','Boolean') 默认NULL,field_valuevarchar(80) 默认NULL,
主键 (field_id),
键form_id_idx(form_id),
约束field_form_id_form_form_id外键 (form_id) 引用form(form_id) 删除级联
) ENGINE=InnoDB 默认字符集=latin1;创建表
form(form_idbigint(20) NOT NULL DEFAULT '0',user_idbigint(20) NOT NULL,titlevarchar(80) DEFAULT NULL,is_activetinyint(1) NOT NULL DEFAULT '1',
主键 (form_id),
键user_id_idx(user_id),
约束form_user_id_user_user_id外键 (user_id) 引用user(user_id) 删除级联
) ENGINE=InnoDB 默认字符集=latin1;创建表
user(user_idbigint(20) NOT NULL DEFAULT '0',passwordvarchar(80) DEFAULT空,
主键 (user_id)
) ENGINE=InnoDB 默认字符集=latin1;
【讨论】:
您希望 用户 更改表结构吗?这意味着您需要执行 mysql alter 查询,可能像
ALTER TABLE the_table DROP COLUMN one_column
或
ALTER TABLE the_table ADD COLUMN another_column
并且您希望在执行此查询之前将其包装在检查表结构的内容中。运行 alter table 查询后,您就可以进行数据管理了。
我认为在更改表结构之前检查表结构的最佳方法是查看系统表
SELECT table_name, column_name, is_nullable, data_type, character_maximum_length
FROM INFORMATION_SCHEMA.Columns
WHERE table_name = 'the_table'
这将返回有关此表中所有列的信息。
这有帮助吗?
【讨论】: