如何设计一个通用数据库,其布局可能会随时间而变化?
技术问答
296 人阅读
|
0 人回复
|
2023-09-14
|
这是一个棘手的问题-如何通过编程创建和审问我无法真正预的数据库?
5 L5 N- u# ^' X( s7 N! B我正在实现一个通用的输入表系统。用户可以创建具有WYSIWYG布局的PHP表格,并用于他想要的任何目的。他还可以查询输入。
* s, I/ a' ~, {+ U* A. s因此,我们分为三个阶段:
/ u. o" o3 }" U% O[ol]设计并生成表格。尽管以后可以编辑表格,但这是一次性的过程。这将设计数据库。
# V( h4 a5 T) J+ q5 _一个人或几个人使用表格-例如,日常销售报告、库存、工资单等,他们的表格输入将写入数据库。
6 c* ?9 l, O% ~! _+ y7 P其他人,也许是管理者,可以查询数据库并生成报告。[/ol]由于这些表单是通用的,我无法预测数据库的结构-只能说它会反映HTML表单字段,并包含来自编辑框,记事,单选按钮等集合的数据输入。+ r7 f7 m( I( Y; k8 c
问题及评论:
8 ~0 L& N2 p% f4 S9 nA)如何以表和列的形式最好地构建数据库?关键是什么?我的第一个想法是用控件名来识别每个列,然后我意识到用户可以编辑表格并重命名,以便名称成为员工或工资:salary。我倾向于每个人都有一个独特的数字。6 T- j) _' G/ C) g( t% o" o
B)如何最好地键控行?我正在考虑一个时间戳,允许我查询和A的行ID的列
4 F0 P9 L' [+ `C)我必须处理列重命名/插入/删除。敌人删除,我不确定是否要从数据库中删除数据。即使用户不再从表单中输入,他也可能希望查询之前输入的内容。否则,可能会有一些法律要求来保留数据。重命名/插入/删除列中的任何陷阱?
+ v+ [3 {! Q3 D5 V6 m5 G, jD)对于查询,我可以让我PHP询问数据库以获取列名并生成列表。每个项目都有一个数据库列名和一个复选框,说明是否应该在查询中使用,并根据列类型和一些选择标准。这足以建立一个职位=’高级推销员’且薪水>1 O% w( q4 S/ K. q1 @' I
50k搜索等等。
7 T5 Y, p4 ?' S* oE)我可能必须生成一些奇怪的图表-图形、直方图、蛋糕图等据查询结果的图形、直方图、饼图等。我需要找到一些好的FOSS PHP。
+ F1 y+ ~+ s) C; ?F)我还忘了什么?
0 y" W K* D/ }5 a! C. K q这一切对我来说似乎很棘手,但我是数据库n00b-也许大师对你来说很简单?, C- s* i% E+ b5 v5 P
编辑:请不要告诉我不要这样做。我别无选择:-(6 c0 _% K" Y% S% ^4 S6 `) L
编辑:在现实生活中,我不想经常列出重命名/插入/删除。然而,运行几个月后,数据库可能需要更改。我相信这经常发生。我担心我对这个问题的措辞很差。人们认为每10分钟左右就会有意改变。: R* g% \. e- V7 N
事实上,我的用户在安排表格时会定义数据库。他们可能会在第一时间做对,永远不会改变-
/ ?8 f( k# N2 }; S0 b5 j( _$ k特别是如果它们是从纸质表格转换而来的。即使他们决定改变它,它也可能只发生在几个月或几年后,并可能发生在任何数据库中。
& {1 \5 q1 Q+ X我认为这里没有特殊情况,也不认为我们应该专注于变化。也许最好专注于链接-什么是好的主键方案?也许文本输入、数字和备忘录?
8 g( [) }- V8 W2 t/ H
2 t+ P- s- A. u 解决方案: 8 k' D0 i# R5 U1 y, {8 M, s
这对我来说似乎很棘手,但我是数据库n00b-也许大师对你来说很简单?2 e" R/ s) r( |: M) ]' u7 @7 z2 R
不,这是真的 很 很难。从根本上说,你描述的不是数据库应用程序,而是数据库应用程序 构建器 。事实上,这听起来像是在写类似的东西Google App9 R1 e$ D( }' X! s( s
Engine或MS Access网络版代码。编写这样的工具将花费 大量
% m2 F. y* C% ]5 v3 `) T时间和专业知识。
, S' D0 m" t0 d8 n# a( V) HGoogle通过使用BigTable平台实现了灵活的架构。它允许您随意调整架构。问题是,这种灵活性使编写位置=’高级推销员’且薪水>
: g) f, C5 E. t' h9 ?50k这样的查询变得非常困难。
7 c7 D, O# [9 T$ }) [所以,我想NoSQL方法不是你需要的。你想建立一个生成和维护RDBMS架构应用程序。这意味着您需要设计一个元数据存储库来生成动态SQL构建和改变用户架构也可以生成前端。
* ?" c& d( c+ f6 M6 v您的元数据架构需要存储的内容模型生成:
b( |; o7 b Q: P( E外部关系(员工在部门工作): _8 J' F3 g0 d/ b& ^( x
唯一的业务密钥(只有一个部门叫销售)( R+ E1 e. v8 e$ V0 T
参考数据(EMPLOYEE.POSITION的允许值)
8 \- M3 ?/ c. M, C+ v* J9 z列数据类型、大小等7 V5 D9 y; ^4 C5 B2 W2 t/ H
列是否可选(即)NULL或NOT NULL)8 O; M6 G3 ^2 a* y/ Q1 L
复杂的业务规则(员工奖金不得超过其工资的15%) . l2 n8 O: O. \& [+ b9 W, |" Z+ u6 R" h
列的默认值对于前端代6 y8 U1 R+ C; j5 ]: Z4 U& H7 E5 f
显示名称或标签(工资、工资)
, Z8 ^: O1 Z7 }2 Q+ Z( i小部件(下拉列表,弹出日历)
" K; O( v/ v. n! z& Q3 h. O9 _4 ?隐藏的领域
; p M6 I! ~: l' Z" ]- W Q7 w派生字段" j# O; `7 z! | y2 K4 g. d5 M
帮助文字,提示
: W7 R1 P1 g; ?+ R( T% d客户验证(相关)JavaScript等)最后一点说明你的提案可能很复杂:像Joe Soap这样的常规表单设计师将无法编写JS(例如)验证输入值X和Y因此,您将使用模板规则导出它。
% ~' x; U/ A& J9 ]& Z8 s这些绝不是详细的清单,只是我的头。
% P& h4 @( f4 n9 \9 [对于主键,建议您使用GUID数据类型列。时间戳不能保证是唯一的,尽管如果您在操作系统中运行到六个位置(即非)Windows)上运行数据库不太可能发生冲突。
+ m1 n% D7 e; X( L% s1 K! k9 r2 I6 x遗言我最初的想法是用控件名来识别每一列,然后我意识到用户可以编辑表格并重命名,使名称成为员工或工资salary。我倾向于每个人都有一个独特的数字。2 t& N f9 \" f7 ]' `5 @0 q" i
我以前建立过数据库模式生成器。这对他们来说很困难。调试动态可能很困难SQL。因此,让自己更容易:使用表和列的真实名称。仅仅因为应用程序用户现在想查看标题HEADCOUNT这并不意味着你必须重命名EMPLOYEES表。因此,显示的标签需要与模型对象的名称分开。否则,你会发现自己试图找出为什么会产生SQL语句失败:: Y" I( M2 o$ Y. [
update table_11123set col_55542 = 'HERRING'where col_55569 = 'Bootle'/疯狂可以撒谎。 |
|
|
|
|
|