【发布时间】:2011-03-01 23:20:50
【问题描述】:
这是一个棘手的问题 - 我如何以编程方式创建和查询一个我无法真正预见其内容的数据库?
我正在实现一个通用输入表单系统。用户可以创建具有所见即所得布局的 PHP 表单,并将它们用于他希望的任何目的。他还可以查询输入。
所以,我们分为三个阶段:
- 设计并生成了一个表单。这是一个一次性的过程,尽管以后可以编辑表单。这设计了数据库。
- 有人或几个人使用该表单 - 例如用于每日销售报告、库存管理、工资单等。他们对表单的输入被写入数据库。
- 其他人(可能是管理层)可以查询数据库并生成报告。
由于这些表单是通用的,我无法预测数据库结构 - 只能说它将反映 HTML 表单字段并包含来自编辑框、备忘录、单选按钮等集合的数据输入。
问题和评论:
A) 就表和列而言,我怎样才能最好地构建数据库?主键呢?我的第一个想法是使用控件名称来标识每一列,然后我意识到用户可以编辑表单并重命名,这样可能“name”变成“employee”或者“wages”变成“:salary”。我倾向于为每个人设置一个唯一编号。
B) 如何最好地键入行?我正在考虑允许我查询的时间戳以及来自 A) 的行 ID 的列
C) 我必须处理列重命名/插入/删除。敌人删除,我不确定是否要从数据库中删除数据。即使用户不再从表单输入它,他也可能希望查询之前输入的内容。或者可能有一些法律要求来保留数据。列重命名/插入/删除中的任何陷阱?
D) 对于查询,我可以让我的 PHP 查询数据库以获取列名并生成一个带有列表的表单,其中每个条目都有一个数据库列名,一个复选框来说明是否应该在查询中使用它和,基于列类型,一些选择标准。这应该足以建立像“职位 = '高级推销员'和薪水 > 50k”这样的搜索。
E) 我可能需要生成一些花哨的图表——图形、直方图、饼图等,用于随着时间的推移查询数值数据的结果。我需要为此找到一些好的 FOSS PHP。
F) 我还忘记了什么?
这一切对我来说似乎很棘手,但我是数据库 n00b - 也许对你们大师来说很简单?
编辑:请不要告诉我不要这样做。我别无选择:-(
编辑:在现实生活中,我不希望列重命名/插入/删除频繁。但是,运行几个月后,可能需要对数据库进行更改。我确信这种情况经常发生。我担心我对这个问题的措辞很糟糕,人们会认为每 10 分钟左右就会不择手段地做出改变。
实际上,我的用户在布置表单时会定义一个数据库。他们可能第一次就做对了,而且永远不会改变它——特别是如果他们是从纸质表格转换而来的。即使他们决定改变,这也可能只会在几个月或几年之后发生一次或两次——这可能发生在任何数据库中。
我不认为我在这里有特殊情况,也不认为我们应该专注于改变。也许更好地专注于链接 - 什么是好的主键方案?比如说,对于一个文本输入、一个数字和一个备忘录?
【问题讨论】:
-
即使您在这件事上别无选择,但了解您正在进入的领域可能会有所帮助,这就是内部平台效应 (en.wikipedia.org/wiki/Inner-platform_effect) 的一个案例。您实际上是在制作一个元系统,以使用户能够完成程序员应该做的工作。祝你好运。 :)
-
如果这个项目成功了,就不需要别的了吗?
标签: php sql database database-design dynamic-sql