PHP/MySQL:处理问卷输入


PHP/MySQL: Handling Questionnaire Input

我为用户准备了一份调查问卷,根据相似的兴趣进行匹配:40个类别,每个类别有3到10个子类别。每个子类别都有一个与他们对该子类别的兴趣程度相关的0 - 5值(0表示根本不感兴趣,5表示死忠粉丝)。让我们以sports为例:

<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格式的子类别值(由于许多原因,我知道这是一种糟糕的做法)。

现在,我没有足够的资源来创建一个专门用于兴趣的完整数据库,并且在profiles数据库中有40个数据表是混乱的。我一直在取出CSV(看起来像0,2,4,1,5,1),将它们打开,并使用我想要的数字,这似乎真的很低效。

如果它只是简单的是/否,我可以看到做位掩码(我在另一个地方做-也许有一种方法可以使这个工作与6-ary值?). 是否有其他方法可以有效地存储这类分类数据?

不是通过在用户表中为每个问题添加额外的字段来实现这一点,而是创建一个答案表,其中每个答案记录存储用户记录的唯一标识符。然后,您可以使用joins一起查询这两个表,以便仅为特定用户隔离这些答案。此外,您希望创建一个问题表,以便将答案链接到特定的问题。

表1)user: (uniqueID,标识信息)

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

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

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

表5)maincategories:(uniqueID,text)

单个用户有一条用户记录,但有多条回答记录。当用户回答问题时,在答案表中创建一条新记录,存储用户的唯一id、问题的唯一id和他们的答案值。

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

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

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

注意这个方案只处理两个级别的类别:sports->football。如果你有3个关卡,那么以同样的方式添加另一个关卡。如果你的关卡是任意的,那么可能会有其他更适合的方案。

好的,那么,假设您有40个类别和10个子类别,那么每个用户就有400个问题-答案对。

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

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

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

question_id | user_id | answer

如果我能预见到更多这样的民意调查,有相同的问题,可能有相同的受访者,我将进一步扩展"campaign_id"的结构。这将用作原始数据存储,可以快速方便地进行任何类型的统计。

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

现在,如果所有这些都不能让你快乐,那么还有另一个有趣的方法。如果数据集是固定的,也就是说,几乎没有条件问题,那么,考虑到您可以创建问题索引,您可以进一步创建有趣的400字节的答案块,其中每个字节将表示任何给定值中的答案。然后你要做的是创建你的统计方法,基于问题id,可以很容易地操作$answer[$user][$nth]字节(或$answer[$nth][$user]——再次,基于你需要的统计类型)

这应该有助于你把你的思想集中在你想要实现的目标上。

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

还有MySQL和SQLite的工具,可以让你毫不费力地从CSV文件创建表和导入数据。

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

tblCategories (pkCategoryID, fldCategoryName)

tbsubcategory (pkSubCategoryID, fkdSubCategoryName)

tblCategorySubCategory (fkCategoryID fkSubCategoryID)

,然后使用内部连接来填充页面。

我认为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,
        }
     }
 }

注意您需要对"category"类使用"抽象"以保持对象体系结构的正确