【问题标题】:design choice for a data structure customizable by the user?用户可定制的数据结构的设计选择?
【发布时间】:2011-07-05 15:07:59
【问题描述】:

我正计划构建一个必须允许用户动态设置自己的数据模型(即创建字段、数据结构等)的应用程序。

我面临着几种技术可能性,都有缺点。 :

  1. 在管理屏幕中,更新数据库的 SQL 模式以反映更改。
    • 我担心这是一个非常糟糕的主意,因为应用程序必须拥有数据库上的权限。而且,如果每次点击都必须应用一个新的 sql 模式,我想我会直接跑一个洞。这是我在大多数用户可自定义的应用程序中看到的方法。
  2. 在 DB 模式中创建一组通用的额外列,并希望有足够的列用于复杂的数据模型。
    • 如果我的应用中不能允许超过 X 列,这很快就会成为功能限制
  3. 将所有具有 ID 列和 Xml 列的项目存储在一个表中,以存储用户定义的列。
    • 这种方法可能会消除前面提到的缺点,因为 sql 架构将保持静态,但由于 EF(我希望能够使用)不知道如何管理 xml 数据类型,我最终将不得不要么手动使用带有 XML 函数的 SqlCommand,要么编写自定义 EF 提供程序,我想这将是很多工作。
    • 这是 Microsoft 为 SharePoint 选择的方法...这让我认为它是更好的方法(或至少不那么糟糕)
  4. 创建一个“属性”表,其中基本上包含一个 itemId 列、一个属性名称列和一个属性值列
    • 这种方法意味着一个非常大的表(X 项 * 每个项的 Y 属性)
    • 我必须以纯文本形式存储我的值,即使它是数字的。

我的要求是:

  • 保持代码可维护、可单元测试和所有老式技术
  • 拥有包含大量数据的响应式应用程序
  • 拥有尽可能安全的应用程序
  • 允许用户完全自定义他们的应用程序(创建自定义视图,对用户属性进行过滤/排序)。

我觉得现在选择正确的设计一定是好的,因为后者很难改变。

任何反馈将不胜感激

【问题讨论】:

  • 好主意,可能有用,但你的意思是动态它确实包括删除字段/属性?
  • @eSPiYa:是的...“完全可定制”...只有一些字段是必需的(id、creator 等),其他必须添加/删除/更新/等。按用户
  • 如果您对使用 XML 数据类型的方法感兴趣,我可以给您一个示例,如何使其在 EF 中工作。我喜欢将自定义视图序列化为 XML 的想法。
  • @J. Tihon:是的,我当然感兴趣 :)
  • @Steve B:我有一个想法,但在我能够发布之前,我发现 AdaTheDev 的建议要好得多。这是我第一次听说 NoSQL,但根据 Wikipedia 关于它的条目,它比 RDBMS 快得多,而且 Facebook 已经在使用它来处理 50TB 的海量数据存储。只需学习如何使用它并在单元测试之外执行批量测试,因为这是一项新技术,您不希望因为存储的大量数据而崩溃您的应用程序。

标签: c# database-design architecture


【解决方案1】:

看起来这将是 EAV 模式(实体属性值)的一个很好的候选者,它类似于您描述的选项之一。

Entity Attribute Value 模式。

若想进一步了解概念层面的内容,您可以阅读这篇文章 > Attribute-value-system

【讨论】:

    【解决方案2】:

    我不认为你可以不加修改就使用 EF 或其他 ORM 框架。您将需要自定义代码,但我们喜欢构建新事物,是吗?

    我看到了两个不错的解决方案:

    1) 与您的 1. 解决方案类似,使用 2 个表,一个用于定义列,第二个用于数据。例如,您的定义表可能如下所示:

    名称 类型 描述 MyColumn1 int int 列 MyColumn2 字符串字符串列

    数据表包含用实际数据填充的通用命名列。

    Col1 Col2 1 串 1 2 串 2

    当您查询“数据类型”时,您会阅读“定义”,然后查询实际数据。您可以在定义表中存储其他属性,例如验证器...

    3) 如果您使用的是 MS SQL >= 2008,第三种解决方案看起来不错。我仍在为每种“数据类型”推荐单独的表格。

    我不推荐解决方案 2,它看起来像一个糟糕的 hack。 解决方案 4. 看起来很干净,但这种方法不适合大型数据集。

    【讨论】:

      【解决方案3】:

      必须说,任何有充分表现的人都不是 100% 现实的。

      假设您使用的是关系数据库,我会选择选项 #1。您仍然有机会利用使 RDBMS 快速运行的存储设计。您可以通过使用存储过程进行 DDL 更改并限制这些 SP 的执行权限来降低安全风险。

      选项 2 可以完成,但在尝试确定小部件颜色是否存储在 UDFText39 或 UDFText52 中时可能会出现维护问题。

      “大量数据”似乎排除了选项 3,除非您采用非关系解决方案。在 RDBMS 中,这会很慢。

      选项 #4 是一个全面的坏主意,因为您不仅要混合数据域(颜色、大小等),还要混合数据类型。远离这个。

      【讨论】:

        【解决方案4】:

        我会说最干净的解决方案是#4。

        根据您要使用的数据类型创建一个表。 - 数值 - 字符串值 - 日期时间值 - ...

        所以你没有一张令人难以置信的大桌子,同时你的类型很强大。 唯一限制: 您仅限于许多受支持的数据类型。但恕我直言,这是一个自然的限制。

        【讨论】:

          【解决方案5】:

          一种选择是使用无模式的 NoSQL 数据库,例如 MongoDB。不需要预先定义新字段(没有架构修改麻烦),不同的记录可以有不同的字段。这是像这样的 NoSQL 存储的好处之一。

          例如在 mongo 中,您的“表”可以合法地包含以下 2 条记录:

          {
              "ID" : 1,
              "FirstName" : "Joe",
              "LastName" : "Bloggs",
              "FavouriteColour" : "Blue"
          }
          
          {
              "ID" : 2,
              "FirstName" : "John",
              "LastName" : "Smith",
              "DOB" : "2000-01-01"
          }
          

          添加新字段就像开始将其包含在记录中一样简单。

          根据我的经验,在像 SQL Server 这样的 RDBMS 中拥有完全灵活/动态的架构可能会有点痛苦,并且很难实现高性能。我对您列出的选项 1) 和 3) 有经验。当数据以 XML 格式存储时,我通常最终出于某些目的需要将数据分解成关系形式。

          【讨论】:

          • 好建议,这是我第一次听到这种技术。可能会在我正在进行的项目中使用。 ^_^
          • NoSQL 根据我的要求看起来很有希望。我从没想过我可以没有 RDBMS :)。我去看看 mongoDB...
          • 有很多 NoSQL 数据库,都有不同的方法(例如,像 MongoDB 这样的文档数据库,像 Redis 这样的键值数据库......)所以建议研究各种类型和特性/权衡每一个。 NoSQL 是一个很大的话题,因此建议您在决定之前先了解全局(例如,您不能在 MongoDB 中进行 JOIN)。请注意,RDBMS 不会去任何地方,它们仍然很稳定。只是他们提供不同的东西。
          猜你喜欢
          • 1970-01-01
          • 2011-08-06
          • 2011-12-23
          • 1970-01-01
          • 2010-09-11
          • 2016-04-22
          • 2013-02-13
          相关资源
          最近更新 更多