1

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

比赛 1 可能只需要名字

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

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

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

理论上,我可以为每个可能的字段创建一个包含一列的数据库表,但是当比赛有特定要求时,例如“用 100 个字告诉我们为什么……”或“输入你最喜欢的 5 件事”,它就行不通了。 。”

回答:

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

最初我打算使用 EAV,但我仍然认为它可能更适合这种特定场景。但一般不推荐,因为它的可扩展性差,查询复杂,我不想养成使用它的习惯。在我的测试中,这两个答案都非常有效。

4

2 回答 2

2

我认为您对 EAV 保持谨慎是正确的,因为它会使您的代码更加复杂,并且对表进行临时查询会更加困难。

我见过许多企业应用程序简单地采用类似以下架构的东西 -

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

在这种情况下,通用字段(Field1 等)对于不同的比赛有不同的含义。为了便于查询,您可以为每个比赛创建不同的视图,并在其中使用正确的字段名称。

于 2012-05-07T03:21:46.983 回答
1

我通常对使用它犹豫不决,但如果您使用数据库,这对于实体属性值模型来说似乎是一个很好的情况。

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

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

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

于 2012-05-07T02:58:48.053 回答