当前位置: 首页 > 面试题库 >

如何设计一个通用数据库,其布局可能会随时间变化?

车诚
2023-03-14
问题内容

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

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

因此,我们分为三个阶段:

  1. 设计并生成表格。尽管可以稍后编辑表单,但这是一次性的过程。这将设计数据库。
  2. 一个人或几个人使用该表格-例如日常销售报告,库存,工资单等。他们对表格的输入将写入数据库。
  3. 其他人,也许是管理人员,可以查询数据库并生成报告。

由于这些表单是通用的,因此我无法预测数据库的结构-只能说它将反映HTML表单字段,并包含来自编辑框,记事,单选按钮等集合的数据输入。

问题和评论:

A)如何以表和列的形式最好地构造数据库?那主键呢?我的第一个想法是使用控件名称来标识每一列,然后我意识到用户可以编辑表单并重命名,以便“名称”成为“雇员”或“工资”成为“:salary”。我倾向于每个人都有一个唯一的数字。

B)如何最好地对行进行键控?我在考虑一个时间戳以允许我查询和A的行ID的列

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

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

E)我可能必须生成一些奇特的图表-图形,直方图,饼图等,以用于随时间推移的数值数据查询结果。我需要为此找到一些好的FOSS PHP。

F)我还忘记了什么?

这一切对我来说似乎很棘手,但是我是数据库n00b-也许对您来说大师很简单?

编辑:请不要告诉我不要这样做。我别无选择:-(

编辑:在现实生活中,我不希望列重命名/插入/删除很频繁。但是,运行几个月后,可能需要对数据库进行更改。我相信这经常发生。我担心我对这个问题的措辞很差,人们认为每10分钟左右就会有意地做出更改。

实际上,我的用户在布置表单时会定义一个数据库。他们可能会在第一时间做到正确,并且永远不会改变它-
尤其是如果他们是从纸质表格转换而来的。即使他们决定更改,这也可能只在几个月或几年后发生一次或两次,并且可能在任何数据库中发生。

我认为我这里没有特殊情况,也不认为我们应该专注于变化。也许最好专注于链接-什么是好的主键方案?也许要说一个文本输入,一个数字和一个备忘录?


问题答案:

“这对我来说似乎很棘手,但是我是数据库n00b-也许对您来说大师很简单?”

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

Google通过使用BigTable平台实现了灵活的架构。它使您可以随意调整架构。问题是,这种灵活性使编写“位置=’高级推销员’且薪水>
50k”之类的查询变得非常困难。

因此,我认为NoSQL方法不是您所需要的。您想要构建一个生成和维护RDBMS架构的应用程序。这意味着您需要设计一个元数据存储库,从中可以生成动态SQL以构建和更改用户的架构,还可以生成前端

您的元数据架构需要存储的内容

对于模式生成:

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

对于前端代

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

最后一点表明您的提案可能存在复杂性:像Joe Soap这样的常规表单设计者将无法编写JS来(例如)验证输入值在X和Y之间,因此您将拥有使用模板化规则导出它。

这些绝不是详尽的清单,只是我的头上。

对于主键,建议您使用GUID数据类型的列。时间戳不能保证是唯一的,尽管如果您在运行到六个位置的操作系统(即非Windows)上运行数据库,则不太可能会发生冲突。

遗言

“我最初的想法是使用控件名称来标识每一列,然后我意识到用户可以编辑表单并重命名,以便“名称”成为“雇员”或“工资”成为“:salary”。我倾向于每个人都有一个唯一的数字。”

我之前已经建立了数据库模式生成器。他们很难。可能很难做的一件事是调试动态SQL。因此,让自己变得更轻松:对表和列使用真实名称。仅仅因为应用程序用户现在想要查看标题为HEADCOUNT的表单,并不意味着您必须重命名EMPLOYEES表。因此,需要将显示的标签与模式对象名称分开。否则,您会发现自己试图弄清楚为什么此生成的SQL语句失败:

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

那样疯狂就可以说谎。



 类似资料:
  • 问题内容: 我认为这是一个相当普遍的问题:如何将我的业务逻辑放在分布式系统环境中的全局事务中?举一个例子,我有一个TaskA包含几个子任务: TaskA {subtask1,subtask2,subtask3 …} 这些子任务中的每一个都可以在本地计算机或远程计算机上执行,我希望TaskA通过事务以原子方式(成功或失败)执行。每个子任务都具有回滚功能,一旦TaskA认为操作失败(因为子任务之一失败

  • 问题内容: 我们目前正在开发一个应用程序,其中多个实体具有关联的营业时间。营业时间可能会持续数天,也可能会在一天内。 前任。星期一在6:00开放,星期五在18:00关闭。 或者 星期一在06:00开放,星期一在15:00关闭。 同样,一个实体每天可能有多组开放时间。到目前为止,我发现最好的设计是定义一个开放时间,其中包括以下内容: StartDay,StartTime,EndDay和EndTime

  • 我试图为自己创建一个使用DynamoDB的简单应用程序。我从未在高级级别上使用过非关系型数据库,只是在这里和那里存储一个值。 该应用程序是一个记录器。我将记录一些东西,迪纳摩将记录日期并计算一天。 例如,一个用户今天记录多件事情,它只会说今天的日期和记录的时间:5 然后,我可以进行查询,以获取过去一周/一天/一个月内所有logged_times的总和。 我的问题是如何构造一个NoSQL数据库来完成

  • 1、数据库设计最起码要占用这个项目开发的40%以上的时间 2、数据库设计不仅仅停留在页面demo的表面 页面内容所需字段,在数据库设计中只是一部分,还有系统运转、模块交互、中转数据、表之间的联系等等所需要的字段,因此数据库设计绝对不是简单的基本数据存储,还有逻辑数据存储。 3、数据库设计完成后,项目80%的设计开发都要存在你的脑海中 每个字段的设计都要有他存在的意义,要清楚的知道程序中如何去运用这

  • 因此,我在为我的数据库提出实体关系时遇到了一些麻烦,但是我已经完成了一些设计过程,并且是最低口径的。将创建数据库,以便学生可以有许多课程的许多对许多关系(显然我知道)。数据库需要每天跟踪家庭作业和出勤率。但是,课程可以只是一周中的一天或许多天。 顾问- 学生- 课程- 学生课程- 这里我陷入了困境,我想创建一个日历表,但我如何将数据关联到作业表和出勤率。如有任何建议,欢迎批评指正。

  • 用例是为数字合成产生正弦波,因此,我们需要计算sin(d t)的所有值,其中: 幼稚的实现方式是: 但是,问题是当t增加时,精度会降低,因为给“sin”函数提供了大量的数字。 改进的版本如下: 输出: