这是一个棘手的问题 – 我如何以编程方式创建和查询其内容我无法预见的数据库?

我正在实现一个通用的输入表单系统.用户可以使用WYSIWYG布局创建PHP表单,并将其用于他希望的任何目的.他也可以查询输入.

所以,我们有三个阶段:

>设计并生成表单.虽然可以在以后编辑表单,但这是一次性过程.这设计了数据库.
>某人或几个人使用表格 – 例如每日销售报告,库存,工资单等.他们对表格的输入被写入数据库.
>其他人,也许是管理层,可以查询数据库并生成报告.

由于这些形式是通用的,我无法预测数据库结构 – 除了说它将反映HTML表单字段并且包括来自编辑框,备忘录,单选按钮等的集合的数据输入.

问题和评论:

A)如何在表和列方面最好地构建数据库?主键怎么样?我的第一个想法是使用控件名称来标识每一列,然后我意识到用户可以编辑表单并重命名,这样可能“name”变为“employee”或“salary”变为“:salary”.我倾向于每个人的唯一号码.

B)如何最好地键入行?我在想一个允许我查询的时间戳和来自A的行Id的列

C)我必须处理列重命名/插入/删除.敌人删除,我不确定是否从数据库中删除数据.即使用户不再从表单输入它,他也可能希望查询先前输入的内容.或者可能存在一些保留数据的法律要求.列重命名/插入/删除中的任何问题?

D)对于查询,我可以让我的PHP查询数据库以获取列名并生成一个带有列表的表单,其中每个条目都有一个数据库列名,一个复选框说明它是否应该在查询中使用,并且基于列类型,一些选择标准.这应该足以构建像“position =’高级推销员’和薪水> 50k”这样的搜索.

E)我可能不得不生成一些奇特的图表 – 图表,直方图,饼图等,以便随着时间的推移查询数值数据的结果.我需要为此找到一些好的FOSS PHP.

F)我还忘记了什么?

对我来说这一切看起来都很棘手,但我是数据库n00b – 也许你对大师来说很简单?

编辑:请不要告诉我不要这样做.我没有任何选择:-(

编辑:在现实生活中,我不希望列重命名/插入/删除频繁.但是,运行几个月后可能需要更改数据库.我确信这种情况经常发生.我担心我已经严重地提出了这个问题并且人们认为每10分钟左右就会发生变化.

实际上,我的用户将在布置表单时定义数据库.他们可能第一次就做对了,永远不会改变它 – 特别是如果他们从纸质表格转换.即使他们决定改变,这可能只发生一次或两次,数月或数年后 – 这可能发生在任何数据库中.

我不认为我在这里有一个特例,也不认为我们应该专注于改变.或许更好地专注于联系 – 什么是一个好的主键计划?也许,对于一个文本输入,一个数字和一个备忘录?

“This all seems very tricky to me,but
I am database n00b – maybe it is
simple to you gurus?”

不,这真的很棘手.从根本上说,您所描述的不是数据库应用程序,而是数据库应用程序构建器.事实上,听起来好像你想编写像Google App Engine这样的代码或MS Access的网络版.编写这样的工具将花费大量时间和专业知识.

谷歌通过使用其BigTable平台实施了灵活的架构.它允许您随意弯曲架构.问题是,这种灵活性使得很难编写诸如“position =’高级销售员’和薪水> 50k”之类的查询.

所以我认为Nosql方法不是你需要的.您希望构建一个生成和维护RDBMS模式的应用程序.这意味着您需要设计一个元数据存储库,您可以从中生成动态sql以构建和更改用户的模式,并生成前端.

您的元数据架构需要存储的东西

对于模式生成:

>外键关系(员工在DEPARTMENT中工作)
>唯一的业务键(只能有一个名为“Sales”的DEPARTMENT)
>参考数据(EMPLOYEE.POSITION的允许值)
>列数据类型,大小等
>列是否可选(即NULL或NOT NULL)
>复杂的业务规则(员工奖金不得超过其工资的15%)
>列的默认值

对于前端一代

>显示名称或标签(“工资”,“薪水”)
>小部件(下拉列表,弹出日历)
>隐藏的领域
>派生字段
>帮助文字,提示
>客户端验证(关联的JavaScript等)

最后一点指出了你的提案中潜在的复杂性:像Joe Soap这样的常规表单设计者无法制定JS来(比如说)确认输入值在X和Y之间,所以你将会有使用模板化规则导出它.

这些绝不是详尽的清单,它只是我的头脑.

对于主键,我建议您使用GUID数据类型的列.时间戳不能保证是唯一的,但是如果你在一个操作系统上运行你的数据库到六个地方(即不是Windows),你就不太可能发生冲突.

遗言

‘My first thought was to use the
control name to identify each column,
then I realized that the user can edit
the form and rename,so that maybe
“name” becomes “employee” or “wages”
becomes “:salary”. I am leaning
towards a unique number for each.’

我以前构建过数据库模式生成器.他们很难过.可能很难的一件事是调试动态sql.因此,让自己更容易:对表和列使用真实姓名.仅仅因为应用程序用户现在想要查看标题为HEADCOUNT的表单,这并不意味着您必须重命名EMPLOYEES表.因此需要将显示的标签与模式对象名称分开.否则你会发现自己试图找出这个生成的sql语句失败的原因:

update table_11123
set col_55542 = 'HERRING'
where col_55569 = 'Bootle'
/

疯狂就是这样.

php – 如何设计一个通用数据库,其布局可能随时间而变化?的更多相关文章

  1. HTML5新增form控件和表单属性实例代码详解

    这篇文章主要介绍了HTML5新增form控件和表单属性实例代码详解,需要的朋友可以参考下

  2. wordpress添加Html5的表单验证required方法小结

    这篇文章主要介绍了wordpress添加Html5的表单验证required方法小结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 详解前端HTML5几种存储方式的总结

    本篇文章主要介绍了前端HTML5几种存储方式的总结 ,主要包括本地存储localstorage,本地存储sessionstorage,离线缓存(application cache),Web SQL,IndexedDB。有兴趣的可以了解一下。

  4. HTML5表单验证特性(知识点小结)

    这篇文章主要介绍了HTML5表单验证特性的一些知识点,本文通过实例代码截图的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. ios – 如何/是否在Xcode中制作通用故事板

    在Xcode中创建故事板文件时,您必须选择是否适用于iPhone或iPad.这意味着应始终将iPhone和iPadUI放入单独的故事板中.这是真的?我的应用程序有多个故事板.虽然Main.storyboard文件在iPhone和iPad之间存在很大差异,但其他故事板几乎完全相同.唯一的区别可能是推动iPhone与iPhone上的popover,可以通过编程方式处理.制作两个故事板似乎非常愚蠢和多余.因此,如果制作一个“通用”故事板,是否应该在Xcode中选择iPhone或iPad?

  6. PhoneGap / iOS上的SQLite数据库 – 超过5mb可能

    我误解了什么吗?Phonegap中的sqlitedbs真的有5mb的限制吗?我正在使用Phonegap1.2和iOS5.解决方法您可以使用带有phonegap插件的原生sqliteDB,您将没有任何限制.在iOS5.1中,Websql被认为是可以随时删除的临时数据…

  7. ios – 领域:如何获取数据库的当前大小

    是否有RealmAPI方法使用RealmSwift作为数据存储来获取我的RealmSwift应用程序的当前数据库大小?

  8. ios – 通用链接测试:无法提取应用程序链接所需的信息

    [花了一整天搞清楚这一点–大声笑]

  9. ios – Xcode 7,资产目录通用设备背景图像支持?

    虽然我不确定它与哪种尺寸有关,但由于它不支持x3图像,它也有点过时了?

  10. ios – 在支持通用链接的两个不同应用上支持相同的域名..?

    我有一个支持通用链接的应用程序,它目前在应用程序商店中.假设它支持域www.example.com,因此可以通过此方便地打开通用链接.我们将在相关域中提供applinks:www.example.com.现在说如果我想发布另一个应用程序,它也支持相同的域.现在iOS将如何通过通用链接区分哪个应用程序打开..?

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部