繁体   English   中英

在上传新内容时动态生成SQL表-一个坏主意?

[英]Generating SQL Tables on the fly as new content is uploaded - A bad idea?

我有一个有趣的问题,我一直在研究,并希望得到一些建议:

我试图创建一个模仿需求管理工具的基本功能的工具,作为公司项目的一部分。

基本设计是类似于Windows资源管理器的文件夹和文档设置。 可以在GUI中打开文档,进行编辑和保存。

该文档本身包含一个分层的电子表格(如果有意义的话,请考虑使用带有章节的Excel)。 每章都包含行,这些行实际上只是一些需求文本+一些补充它的值。 当显示时,需求文本和属性值显示为具有过滤功能的独立列(非常类似于Excel)。

代表这类程序的用户/权限/文件夹层次结构/等非常简单,但是我挂在这里的是文档内容本身...

我最关心的是大小及其与性能的关系:作为此工具的一部分,我不仅打算存储每个文档的当前状态,而且要存储自第一天以来所做的更改的整个列表(与SVN相似) ,然后提供对更改历史记录的快速访问。

平均而言,我预计该回购中会包含约500个文档; 每个文档可能会有约20,000个活动行; 在一年的时间里,假设进行约20,000次编辑并非没有道理(意味着每个文档本身每年将额外获得20,000行)。

乘以文档数,得出的行数接近10,000,000(第二年和第二年又增加了10,000,000,依此类推)。 可以清除旧的历史记录,但是只能由管理员执行(最好不要执行此操作)。

如我所见,我有两种方法可以处理这种情况:

  • 我可以尝试代表一个表中所有文档的所有行的列表(很像phpBB如何将所有论坛的所有帖子存储在一个表中),或者...

  • 我可以尝试将每个文档的行存储在唯一命名的表中(这意味着每个文档都有自己的表); 该表必须被赋予唯一的名称,而主表将包含所有文档的列表以及与每个文档相对应的表名。

所以我的问题是:哪个更可取? 都不是很好的选择吗? 鉴于需求,任何人都可以针对您认为更合适的方法提供建议吗?

如果您在应用程序的正常日常运行中以编程方式创建和/或销毁表,那么我会说这是一个非常不好的信号,表明数据库设计中有错误。

数据库系统可以并且确实处理具有这么多行的表。 要在该行数上进行任何有意义的查询,您确实必须谨慎而省事地选择索引。 我的意思是,您确实必须完全了解如何查询表格。

但是,我敢说,与您提议的仅基于ID或数字任意创建新表的方法相比,实现起来要简单得多。 而且,复杂度越低,维护起来就越容易,并且引入难以调试的讨厌的bug的机会也就更少。

如果您真的很想拆分为多个表,那么建议您研究一下其他人如何进行数据分区 与其动态创建表,不如从一开始就根据您认为可能需要的数量创建固定数量的表,然后根据记录中表中有多少记录之类的任意内容将记录分配给这些表。时间,但可以预见-在示例中给出了用户的邮政编码,或者是该文档所在的类别,或者是创建该文档的用户的域名或国家/地区,或者可以用来轻松确定记录位置的逻辑最终会合理分散。

以这种方式进行数据分区(创建所有分区)的好处之一是,如果将来需要的话,迁移到多个数据库服务器相对容易。 如果要动态创建和销毁表,那将使其难以实现。

多表方法要考虑的几点:

  • 在所有文档中查找信息是否必要? 如果是的话,您将需要在所有表格中进行搜索,但这并不是那么简单。
  • 如果架构发生更改,那么更新数据库并不容易,因为代表同一类型实体的所有表都需要更改
  • 跟踪有关用户编辑的信息也不是那么简单,因为它将信息分为多个编辑(例如,考虑“用户修改了哪些文档”的情况)

您是否考虑过替代方法来存储数据? 有必要将数据库中的每个excel行存储为表行吗? 将数据存储为xml,仅将idexes保存在数据库中? 还是只存储跟踪修改和文档版本? 应用程序可以承担一部分数据库负担并进行过滤吗?

您可能需要考虑某种文档管理系统。 这听起来像SharePoint可以做的事情-可以将其设置为在签入文档时创建文档的新版本。文档也可能已分配了元数据,这可能是必需的。

有很多表没有错。 看起来有很多表对您来说是一种更合理的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM