2010-05-30 60 views
1

我正在研究一种设计,我可以为用户提供灵活的属性,而且我很困惑如何继续设计架构。s用灵活的用户配置文件设计数据库

我做了一个表,我一直在系统所需的信息:

表名:用户

  • ID
  • 用户名
  • 密码

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

+1

为什么不把所有属性放在一张表中?一个用户有身份证,用户名,密码,电子邮件,名字等 – corroded 2010-05-30 17:14:07

+0

这里有无数重复上SO:http://stackoverflow.com/questions/2932322/how-to-design-a-schema-where-the-columns-的表格不是固定的 – 2010-05-30 17:28:51

回答

1

你正在寻找一个规范化的表。这是一个具有user_id,key,value列的表,它在用户&这个新表之间产生1:N关系。查看http://en.wikipedia.org/wiki/Database_normalization了解更多信息。对于规范化的表,性能不是很了不起,它可能需要一些有趣的规划来优化代码,但这是非常标准的做法。

1

保持轮廓的固定部分的标准表,以方便查询,添加约束等

对于这听起来像你正在寻找一个entity-attribute-value模型的配置部分。但是,额外的可配置性需要花费很高的成本:所有内容都必须以字符串形式存储,并且必须在应用程序中执行任何数据验证,而不是在数据库中执行。

+0

阅读Joe Celko的评论,为什么要避免EAV:http://www.simple-talk.com/sql/t-sql-programming/avoiding-the-eav-of-破坏/ – 2010-05-30 17:24:54

+2

你是否声称不应该使用EAV?请参阅Bill Karwin的演示http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back page 31.现在您可能会认为这不是EAV的一种适当的用法。如果没有,我想听听为什么。但它不应该被使用。 – 2010-05-30 17:37:04

+0

我在说他们被滥用 - 太多次了,人们会采用EAV方法,而不是真正考虑正确的结构。许多人都没有意识到这些构造是多么糟糕和棘手,以获得任何体面的查询和表现。所以是的 - 尽量避免它们; 95%的时间,你可以 - 如果你努力工作。 – 2010-05-30 20:16:32

1

这些属性将如何使用?它们只是一个数据包吗?或者用户是否期望系统会对这些值做些什么?是否会有任何反对他们的报道?

如果系统必须对这些属性做些什么,那么你应该让它们成为列,因为代码将不得不被写入,而对于这些值做些特别的事情。但是,如果客户只希望他们存储数据,那么EAV可能就是票据。

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

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

一个EAV的价格是vigilence和纪律。你必须有自律和其他开发人员,尤其是报告编写人员对从不过滤一个特定的属性,无论你从管理层获得多少压力。当客户想要过滤或对特定属性执行操作时,它必须成为列的第一类属性。如果你觉得这种纪律不能保持,那么我只是简单地为每个属性创建列,这将意味着对代码的调整,但是它会减少在这条路上的混乱。

+0

+1这是有用的和合理的 – 2011-08-11 07:55:00