PHP / MySQL:处理问卷输入

时间:2011-09-22 18:27:50

标签: php mysql database-design

我有一份调查问卷,供类似兴趣的用户使用:40个类别,每个类别有3到10个子类别。每个子类别都有一个0 - 5的值,与他们对该子类别的兴趣程度有关(0甚至没有远程感兴趣,5是一个铁杆粉丝)。让我们举一个类别运动的例子:

<input type="radio" name="int_sports_football" value="0">0</input>
<input type="radio" name="int_sports_football" value="1">1</input>
<input type="radio" name="int_sports_football" value="2">2</input>
<input type="radio" name="int_sports_football" value="3">3</input>
<input type="radio" name="int_sports_football" value="4">4</input>
<input type="radio" name="int_sports_football" value="5">5</input>

有这么多这些,我有一个有兴趣类别的表,但由于大小,一直使用CSV格式的子类别值(不好的原因,我知道很糟糕的做法)。

现在,我没有资源来创建一个专门用于兴趣的整个数据库,并且在配置文件数据库中有40个数据表是混乱的。我一直在拉出CSV(看起来像0,2,4,1,5,1),爆炸它们,并按照我的意愿使用数字,这看起来效率很低。

如果它只是是/否我可以看到做掩码(我在另一个地方做了 - 也许有办法让这个工作用6个值?)。还有另一种方法可以有效地存储这种分类数据吗?

5 个答案:

答案 0 :(得分:5)

您不是通过向用户表添加每个问题的额外字段来执行此操作,而是创建一个答案表,其中每个答案记录都存储用户记录的唯一标识符。然后,您可以使用joins一起查询这两个表,以便仅隔离特定用户的答案。此外,您还要创建问题表,以便将答案链接到特定问题。

表1)用户:( uniqueID,识别信息)

表2)答案:(uniqueID,userID,questionID,text)链接到唯一的userID和唯一的questionID

表3)问题:(uniqueID,subcategoryID,text)链接到子类别的uniqueID(例如,足球)

表4)子类别:(uniqueID,maincategoyID,text)链接到mainCategory的uniqueID(例如sports)

表5)maincategories :( uniqueID,text)

单个用户有一条用户记录,但有很多回答记录。当用户回答问题时,会在答案表中创建新记录,存储用户的唯一ID,问题的唯一ID以及答案的值。

答案记录链接到单个用户记录(通过引用用户的唯一ID字段)和单个问题记录(通过问题的唯一ID)。

问题记录链接到单个子类别记录。

子类别记录链接到单个类别记录。

请注意,此方案仅处理两个级别的类别:sports-&gt; football。如果您有3个级别,则以相同方式添加另一个级别。如果你的等级是任意的,可能还有其他一些方案更合适。

答案 1 :(得分:2)

好的,所以,鉴于你有40个类别,让我们假设10个子类别,这使我们每个用户有400个问答配对。

现在,为了设计最好的中间数据存储,我建议从几个问题开始:

1)我需要什么类型的分析 2)我有什么资源 3)这是一次性解决方案还是应该在将来重复使用

好吧,如果我是你,我会坚持非常简单的数据库结构,例如:

question_id | user_id | answer

如果我预计会有更多类似的问卷进行同样的问题并且可能有相同的受访者,我会用"campaign_id"进一步扩展结构。这可用作原始数据存储,可以快速简便地进行任何类型的统计。

现在,你说数据库是没有选择的。好吧,你可以使用数组模仿这个相同的结构,并创建自己的统计接口,可以根据数组存储类型工作,但是如果你能得到sql,你可以节省他们和你的时间。正如其他人所说,总有sqlite(基于文件的数据库引擎),它易于使用和设置。

现在,如果所有这些都不能让你开心,那么还有另一个有趣的方法。如果数据集是固定的,意味着几乎没有条件问题,那么,鉴于您可以创建问题索引,您可以进一步创建有趣的400byte答案块,其中每个字节将表示任何给定值的答案。然后你要做的是创建统计方法,根据问题ID,可以轻松地使用$answer[$user][$nth]字节(或$answer[$nth][$user] - 再次,根据您需要的统计类型)

这应该可以帮助您实现想要实现的目标。

答案 2 :(得分:1)

我知道你说你没有资源来创建数据库,但我不同意。使用SQL似乎是最好的选择,PHP包含SQLite(http://us2.php.net/manual/en/book.sqlite.php),这意味着如果这是一个问题,您将不需要设置MySQL数据库

还有MySQL和SQLite的工具,可以让您创建表格并从CSV文件中导入数据而不费吹灰之力。

答案 3 :(得分:0)

也许我很困惑,但似乎你需要一个设计良好的关系数据库。 例如:

tblCategories(pkCategoryID,fldCategoryName)

tblSubCategory(pkSubCategoryID,fkdSubCategoryName)

tblCategorySubCategory(fkCategoryID,fkSubCategoryID)

然后使用内部联接填充页面。希望这可以帮助你:)

答案 4 :(得分:0)

我认为NoSQL架构是在敏捷解决方案中扩展MySQL领域的解决方案。

为了尽快完成它,我创建了一个“兴趣”类的类,它构建了从类别父类扩展的子类实例,它携带了答案的属性,这些属性将作为JSON对象存储在该字段中,例如:

{
     "music": { // category
        "instruments": {    // sub category
            "guitar": 5,        //intrest answers
            "piano": 2,
            "violin": 0,
            "drums": 4
        },
        "fav artist":{
            "lady gaga": 1,
            "kate perry": 2,
            "Joe satriani": 5
        }
     }
     "sports": {
        "fav sport":{
            "soccer": 5,
            "hockey": 2,
        }
        "fav player":{
            "messi": 5,
            "Jordan": 5,
        }
     }
 }

注意您需要对“类别”类使用“抽象”以保持对象架构正确