【问题标题】:sDesigning a database with flexible user profile设计具有灵活用户配置文件的数据库
【发布时间】:2011-06-26 01:49:32
【问题描述】:

我正在设计一种可以为用户提供灵活属性的设计,但我很困惑如何继续设计模式。

我做了一个表格来保存系统所需的信息:

表名:用户

  • 身份证
  • 用户名
  • 密码

现在,我希望创建一个配置文件表并与配置文件表中的所有其他属性(例如电子邮件、名字、姓氏等)建立一对一的关系。我的问题是:有没有办法添加第三个表中哪些配置文件将是灵活的?换句话说,如果我的客户需要创建一个新属性,他/她不需要对代码进行任何自定义。

【问题讨论】:

标签: sql


【解决方案1】:

您正在寻找一个规范化的表格。这是一个具有 user_id、key、value 列的表,这些列在 User 和这个新表之间产生 1:N 关系。查看http://en.wikipedia.org/wiki/Database_normalization 了解更多信息。规范化表的性能并不惊人,它可能需要一些有趣的计划来优化您的代码,但这是一种非常标准的做法。

【讨论】:

    【解决方案2】:

    将配置文件的固定部分保存在标准表中,以便于查询、添加约束等。

    对于可配置部件,听起来您正在寻找entity-attribute-value 模型。但是,额外的可配置性需要付出高昂的代价:所有内容都必须存储为字符串,并且您必须在应用程序中进行任何数据验证,而不是在数据库中。

    【讨论】:

    • 阅读 Joe Celko 关于为什么要避免 EAV 的评论:simple-talk.com/sql/t-sql-programming/…
    • 您是否声称不应该使用 EAV?请参阅 Bill Karwin 的演示文稿slideshare.net/billkarwin/sql-antipatterns-strike-back 第 31 页。现在您可能会或可能不会认为这是 EAV 的适当用法。如果不是,我想听听为什么。但绝对不应该使用它是不正确的。
    • 我是说它们被过度使用了——太多次,人们诉诸 EAV 方法,而不是真正考虑适当的结构。而且很多人没有意识到这些构造是多么糟糕和棘手,才能从中获得任何体面的查询和性能。所以是的——尽可能避免它们; 95% 的时间,你可以——如果你足够努力的话。
    • @marc_s:我同意你的观点,但是在这种情况下,我认为这是一个合理的选择(我能想到的其他选择包括:拒绝功能请求,或者告诉他们雇用程序员每次需要进行更改时,或者编写代码以在添加新的配置文件字段时动态修改数据库,并编写非常通用的代码,使用对数据库的自省来生成 GUI - 这些都不是特别吸引人)。如果您知道避免 EAV 的解决问题的更好方法,我建议您发布替代答案。我当然会感兴趣。
    【解决方案3】:

    如何使用这些属性?它们只是一袋数据,还是用户期望系统会对这些值做一些事情?是否会有针对他们的报告?

    如果系统必须对这些属性做一些事情,那么您应该将它们设为列,因为无论如何都必须编写对这些值进行特殊处理的代码。但是,如果客户只是希望他们存储数据,那么 EAV 可能就是门票。

    如果您要实现 EAV,我建议您在属性表中添加 DataType 列。这使您可以对输入的数据进行一些基本的验证,并动态更改用于输入的控件。

    如果您打算使用 EAV,那么您必须遵循的一条规则是从不编写任何指定特定属性的代码。如果这些自定义属性只不过是一堆数据,那么系统这一部分的 EAV 将起作用。您甚至可以考虑创建一个 XML 列来存储这些属性。 SQL Server 实际上有一个 XML 数据类型,但所有数据库都有某种形式的大文本数据类型也可以工作。在报告中,数据只会被吐出。您永远不会在报告的特定位置放置特定值,也永远不会对数据进行任何类型的数值运算。

    EAV 的代价是警惕和纪律。您必须在自己和其他开发人员之间遵守纪律,尤其是报告编写者,以从不过滤特定属性,无论您从管理层获得多大压力。当客户想要对特定属性进行过滤或操作时,它必须成为列的第一类属性。如果您觉得无法维持这种纪律,那么我会简单地为每个属性创建列,这意味着对代码的调整,但它会减少未来的混乱。

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 1970-01-01
      • 2021-09-24
      • 2012-10-06
      • 2011-04-05
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 2013-11-14
      相关资源
      最近更新 更多