1

我需要在数据库中动态创建动态表。例如,在数据库中,我将有名为:

Table
Column
DataType
TextData
NumberData
DateTimedata
BitData

在这里,我可以在名为 table 的表中添加一个表,然后我可以在 columns 表中将所有列添加到该表中,并将数据类型与每一列相关联。

基本上我想创建表而不实际在数据库中创建表。这甚至可能吗?如果是这样,您能指导我到正确的地方以便我进行研究吗?另外,我更喜欢 sql server 或任何免费的数据库软件。

谢谢

4

5 回答 5

17

您所描述的是实体属性值模型(EAV)。这是设计数据模型的一种非常糟糕的方式。

虽然数据模型非常灵活,但是查询这样的数据模型是相当复杂的。n如果您想选择或过滤n不同的属性,您经常不得不自行加入一个表时间。这变得相当缓慢并且变得相当难以相对快速地优化。

另外,您通常最终会构建数据库或 ORM 将提供的许多功能。

于 2012-08-26T05:32:46.517 回答
8

我不确定您遇到的真正问题是什么,但您提出的解决方案是“数据库中的数据库”反模式,这让很多人感到畏缩。

根据您查询数据的方式,如果您要按照您的计划构建事物,您要么需要一堆分段查询,这些查询连接在中间件中(慢),要么需要一个庞大的整体查询(要么缓慢或造成大量索引膨胀),如果有可能的话。

如果您必须即时创建表,请了解您正在使用的特定数据库引擎的CREATE TABLE ALTER TABLEDDLDROP TABLE语句。更好的是,找到一个可以为您执行此操作的 ORM。如果您的真正问题是需要存储非结构化数据,请查看 MongoDB、Redis 或其他一些 NoSQL 变体。

我最后的建议是将你试图解决的实际问题写成一个单独的问题,你可能会学到更多。

于 2012-08-26T05:30:08.623 回答
2

对文档执行此操作可能会更容易。或许您应该查看一个 noSQL 解决方案,例如mongoDB

于 2012-08-26T05:28:45.760 回答
2

或者您仍然可以创建临时表,但使用 cronjob 并每隔 %% 小时创建一次临时表,并在查询完成后将其重命名为正确的名称。所以你的网站还在空中

您尝试存档的内容还不错,但您必须以正确的逻辑方式使用它。

*对不起,我的英语不好

于 2013-02-26T14:10:57.590 回答
1

我在 LedgerSMB 中做了类似的事情。虽然我们将 EAV 建模用于一些事情(需要灵活性并且我们正在执行的查询类型是直接的,例如菜单节点部分使用它),但一般来说,您希望尽可能远离这种情况尽可能。

更好的方法是执行除数据列之外的所有操作。然后你可以(震惊)创建表格。这为您提供了您添加的内容的目录,以便您的应用程序知道这一点(如果您必须检查,您可以从系统目录中区分!)但同时您可以获得实际的关系建模。

我们在 LedgerSMB 中所做的是让存储过程接受表名存在('extends_' || 提供的名称)。如果是这样,将添加一个具有所需数据类型的列并将其写入应用程序目录。这为我们提供了扩展属性的关系建模。在加载时,应用程序加载应用程序目录并在适当的点写入查询以加载/保存数据。实际上,它工作得很好。

于 2012-08-26T13:31:23.540 回答