我需要动态地在数据库中创建动态表。例如,在数据库中,我将有名为:
的表Table
Column
DataType
TextData
NumberData
DateTimedata
BitData
这里我可以在名为table的表中添加一个表,然后我可以在columns表中将所有列添加到该表,并将数据类型与每个列相关联。
基本上我想创建表而不在数据库中实际创建表。这甚至可能吗?如果是这样,你能指引我到正确的地方,这样我可以研究吗?另外,我更喜欢sql server或任何免费的数据库软件。
由于
答案 0 :(得分:14)
您所描述的是entity-attribute-value model (EAV)。设计数据模型是一种非常糟糕的方式。
虽然数据模型非常灵活,但查询这样的数据模型非常复杂。如果要选择或过滤n
个不同的属性,您经常最终必须自行加入表n
次。这变得缓慢而且变得相当快,并且变得相当难以优化。
另外,您通常最终会构建数据库或ORM提供的许多功能。
答案 1 :(得分:8)
我不确定你遇到的真正问题是什么,但你提出的解决方案是“数据库中的数据库”反模式,这让很多人感到畏缩。
根据您查询数据的方式,如果您要构建类似于您计划的内容,则需要在中间件(慢速)或一个怪物整体中加入一堆分段查询。查询(缓慢或创建大量索引膨胀),如果可能的话。
如果必须动态创建表,请了解您正在使用的特定数据库引擎的CREATE TABLE
ALTER TABLE
和DROP TABLE
DDL语句。更好的是,找到一个能为你做到这一点的ORM。如果您真正的问题是需要存储非结构化数据,请查看MongoDB,Redis或其他一些NoSQL变体。
我的最后建议是将你想要解决的实际问题写成一个单独的问题,你可能会学到很多东西。
答案 2 :(得分:2)
使用文档执行此操作可能会更容易。也许您应该查看一个noSQL解决方案,例如mongoDB。
答案 3 :(得分:2)
或者您仍然可以创建临时表但使用cronjob并在每个%%小时创建临时表,并在查询完成后将其重命名为正确的名称。所以你的网站悬而未决
您尝试存档的内容并不差,但您必须以正确的逻辑方式使用它。
*抱歉我的英文不好
答案 4 :(得分:1)
我在LedgerSMB中做过类似的事情。虽然我们将EAV建模用于一些事情(需要灵活性并且我们正在进行的查询类型是直截了当的,例如菜单节点部分使用它),但一般来说,您希望远离这一点尽可能。
更好的方法是执行除数据列之外的所有操作。然后你可以(震惊的冲击)只是创建表格。这将为您提供已添加内容的目录,以便您的应用程序知道这一点(如果您需要检查,可以从系统目录中进行区分!)但同时您将获得实际的关系建模。
我们在LedgerSMB中所做的是拥有可接受表名的存储过程('扩展_' ||名称提供)。如果是这样,将添加具有所需数据类型的列,并将其写入应用程序目录。这为我们提供了扩展属性的关系建模。在加载时,应用程序加载应用程序目录并在适当的位置根据需要写入查询以加载/保存数据。实际上它运作得很好。