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

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

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

  • 我的要求是:
  • 保持代码的可维护性、单元可测试性和所有成熟的技术
  • 有一个具有大量数据的响应式应用程序
  • 有一个尽可能安全的应用程序
  • 允许用户完全自定义他们的应用程序(使用过滤器/用户属性排序创建自定义 View )。

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

    对于任何反馈,我们都表示感谢

    最佳答案

    一种选择是使用无模式的 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 时,我最终通常需要将数据分解成关系形式以用于某些目的。

    关于c# - 用户可定制的数据结构的设计选择?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5140014/

    10-10 16:45
    查看更多