比赛:存储任意数量的字段

时间:2012-05-07 02:49:01

标签: c# javascript asp.net database-design

我将在我正在制作的当前网站上创建比赛。每场比赛都不会相同,可能会有不同数量的输入字段,用户必须输入这些输入字段才能成为比赛的一部分,例如。

比赛1可能只需要名字

比赛2可能需要名字,姓氏和电子邮件地址。

我还将构建一个工具来观察这些条目,以便我可以查看每个条目。

我的问题是存储任意数量字段的最佳方法是什么?我想到了两个选项,一个是将每个条目写入包含竞争的所有条目的CSV文件,另一个是在数据库中有一个带有varchar字段的db表,它只将整个条目存储为文本。这两种方法看起来都很混乱,这类任务有什么常见的做法吗?

理论上我可以为每个可能的字段创建一个带有列的数据库表,但是当竞争对手有特定要求时它将不起作用,例如“告诉我们100个单词为什么......”或“输入您的5个最爱事情......“

ANSWERED:

我决定使用下面描述的方法,其中有多个通用列可用于每个竞赛的不同目的。

最初我打算使用EAV,我仍然认为它可能稍微适合这种特定情况。但通常建议不要使用它,因为它的可扩展性和查询性很差,我不想养成使用它的习惯。在我的测试中,这两个答案都非常好。

2 个答案:

答案 0 :(得分:2)

我认为你对EAV持谨慎态度是正确的,因为它会使你的代码变得更复杂,并且对表进行即席查询将会更加困难。

我见过许多企业应用程序只是采用类似下面的架构 -

t_Comp_Data
-----------    
CompId  
Name  
Surname  
Email 
Field1 
Field2 
Field3 
... 
Fieldn

在这种情况下,通用字段(Field1等)对于不同的比赛意味着不同的东西。为了便于查询,您可以为每个竞赛创建不同的视图,并使用适当的字段名称。

答案 1 :(得分:1)

我通常对使用它犹豫不决,但如果您使用数据库,这对于Entity-attribute-value模型来说就是一个很好的情况。

基本上,您有一个CompetitionEntry(实体)表,其中包含构成每个条目的标准字段(Competition_id,可能是日期等),然后是具有CompetitionEntry_id,Attribute和Value的CompetitionEntryAttribute表。您可能还需要另一个表用于创建新条目的每个竞赛的模板属性。

不幸的是,您只能存储一种数据类型,这可能必须是一个大的nvarchar。 另一个缺点是难以查询EAV数据库。

另一种选择是每场比赛创建一个表(可能在代码中作为竞赛创建的一部分),但根据比赛的数量,这可能是不切实际的。