【问题标题】:What is the best way to CRUD dynamically created tables?CRUD 动态创建表的最佳方法是什么?
【发布时间】:2011-09-23 16:08:12
【问题描述】:

我正在创建(编辑)一个允许用户(企业)创建自己的表和字段的 ASP.NET 应用程序(SQL Server 后端)。它们都将是父表(非动态)的子表,并具有适当的 PK/FK 关系(创建表时的默认字段)。

但是,我不喜欢当前更新/插入和选择字段的方法。我将创建一个传递正确键和表名的 SP,然后让它返回正确的 SQL 语句。我认为只传递字段/值的名称/值对并让 SP 实际处理它们可能更有意义。这是最好的方法吗?如果是这样,我不擅长SP,所以有什么例子吗?

【问题讨论】:

  • 听起来像是在谈论 EAV(实体-属性-值)结构。看看这里它可能会有所帮助en.wikipedia.org/wiki/Entity-attribute-value_model
  • 我不久前做过的一个项目也有类似的要求。我最终使用了一个包含 2 列的表:ID (PK) 和 Data,其中 Data 是 XML 数据类型。然后我创建并存储了 XML。
  • 我在这里也写过关于 EAV 的文章:sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/… EAV 受到了很多负面报道,但反对它的人并不理解并非所有模型都具有锁定模式的能力。我喜欢 EAV 而不是在 XML 中存储数据的地方在于,可以更轻松地针对痛点自定义索引(尤其是过滤索引)。
  • @JohnHartsock 感谢 EAV 的建议。我以前从不知道那个模型。我的猜测是我不会有太多的字段,也许客户会创建 25-100 个字段。如果我不期望他们创造 1,000 个,这仍然有意义吗?不过,如果我按照我原来的计划,你如何编写参数化的代码?
  • 问题不在于列数,而在于它们的元数据(名称、值范围、数据类型)今天是未知的。

标签: asp.net sql-server


【解决方案1】:

我对 EAV 模型没有太多经验,但听起来它确实是实现您想要实现的目标的好主意。但是,如果您已经有一个系统,那么大修可能会非常昂贵。

如果您对用户表进行的查询是基本的 CRUD 操作,那么只为每个表创建 CRUD 存储过程呢?例如。 -

表:

acme_orders

存储过程:

acme_orders_insert
acme_orders_update
acme_orders_select
acme_orders_delete
... [other necessary procs]

我不知道这些表的业务需求是什么,但我想你目前正在做的任何事情都可以转化为使用存储过程做同样的事情。

【讨论】:

    【解决方案2】:

    我打算创建一个传递正确键和表名的 SP,然后让它返回正确的 SQL 语句。我认为只传递字段/值的 >name/value 对并让 SP 实际处理它们可能更有意义。

    假设您的意思是 proc 会生成然后执行 SQL(有时称为动态 SQL),这可以工作,但它可能比静态/编译 SQL 执行得慢,就像在普通 procs 中一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-06-14
      • 2017-08-06
      • 2013-03-26
      相关资源
      最近更新 更多