2011-11-18 69 views
5

我一直在负责创建一个应用程序,允许用户将数据输入到将被保存并最终用于填充PDF表单域网络形式的能力。数据库模式的建议值

遇到麻烦试图想存储在数据库中的字段值的形式将是动态的好方法(基于PDF场)。

的应用程序本身我将围绕传递数据的哈希表(字段名,fieldValue方法),但我不知道该散列转换为分贝值的最佳方式。

我正在使用MS SQL Server 2000和asp.net webforms。有没有人有过类似的工作?

+0

也许你可以分享一些领域和与我们的关系。有时候,这实际上取决于目的,所以表格必须进行标准化,有时候,我们必须对表格进行非规范化处理(例如在仓储的某些情况下)!:) – Nonym

+0

我仍处于设计的最初阶段,所以没有任何东西以任何方式完成。很可能,正如下面的gview所建议的那样,我将有一个Form表格,用于存储诸如表单类型,created_on等列......表单表格与FormField表具有一对多的关系,存储字段名称,类型和价值。 – pteranodonjohn

+0

只是想补充说,这是一个保险后台办公类型的应用程序。字段值将保存诸如驾驶执照号码之类的信息以解决字段。 – pteranodonjohn

回答

4

你有没有考虑过在这里使用文档数据库?这只是他们解决的问题,比传统的RDBMS解决方案好得多。就我个人而言,我是RavenDb的忠实粉丝。另一个相当不错的选择是CouchDb。我会避免使用MongoDb,因为它在当前的实现中确实不是数据安全的地方。

即使你不能使用文档数据库,就可以使SQL假装通过设置你的表有与有效载荷字段是序列化XML或JSON传统列的一些元数据是一个。这将允许您在EAV-land外出时搜索元数据。 EAV-land是一个可怕的地方。

UPDATE

我不知道,如果一个很好的指导存在,但概念是非常简单的。基本思想是将你想查询的部分分解成表格中的“普通”列 - 这可以让你以标准方式进行查询。当你找到你想要的记录时,你可以抓住CLOB并将其反序列化。你的情况,你会看起来像一个表:

SurveyAnswers 
    Id INT IDENTITY 
    FormId INT 
    SubmittedBy VARCHAR(255) 
    SubmittedAt DATETIME 
    FormData TEXT 

几个protips:
一)使用基于文本的序列程序。给你一个解决数据错误的战斗机会,真正帮助调试。
b)对于SQL 2000,您可能需要考虑将CLOB(包含有效负载数据的TEXT字段)分解到单独的表中。自从我使用SQL 2000以来,它已经很长时间了,但是我的回忆是使用TEXT列对表格做了不好的事情。

+0

我真的很喜欢这个想法。我希望将信息存储在json或xml中,但我对数据库存储非常有限。基本上坚持与MS SQL SERVER 2000.你能提供一些方向,我可以找到在列中使用元数据的文档? – pteranodonjohn

+0

只是扩大了答案,我在基于Sql 2000的应用程序FWIW上非常成功地使用了它。 –

1

我建议镜像相同的结构:

Form 
----- 
form_id 
User 
created 

FormField 
------- 
formField_id 
form_id 
name 
value 
1

为你所描述的所谓Entity Attribute Value(EAV),该模型可以是一个皇家疼痛处理解决方案。所以你应该尽可能地限制你对此的使用。

例如是否有字段几乎总是在形式(姓,名,电子邮件等),那么你应该把它们放在一个表作为字段。

这样做的原因是因为如果不这样做别人迟早会认识到,他们有这些名字和电子邮件,并要求你建立这个查询

 SELECT 
     Fname.value fname, 
     LName.Value lname, 
     email.Value email, 
     .... 
    FROM 
     form f 
     INNER JOIN formFields fname 
     ON f.FormId = ff.FormID 
      and AttributeName = 'fname'  
     INNER JOIN formFields lname 
     ON f.FormId = ff.FormID 
      and AttributeName = 'lname' 
     INNER JOIN formFields email 
     ON f.FormId = ff.FormID 
      and AttributeName = 'email' 
     .... 

时,你可以写这

SELECT 
     common.fname, 
     common.lname, 
     common.email, 
     .... 
    FROM 
     form f 
     INNER JOIN common c 
     on f.FormId = c.FormId 

而且只要你可以下车SQL 2000的,因为你要真的很怀念UNPIVOT条款

它也p robably不是一个坏主意,看看以前的SO EAV questions给你一个人们遇到过的问题的想法

+0

感谢您的输入,我一定会研究EAV。我希望我能够脱离SQL 2000,但是恐怕很长一段时间会让我留在那里。 – pteranodonjohn