2012-03-13 92 views

回答

3

将多个值存储在一列中几乎总是一个坏主意,因为难以解析出值您需要并可以在提取零件所需的字符串操作后使列索引不可用。

制作一个标准化的表格,每个用户每个答案存储一行。如果个人答案本身就是一个单一的数据点,它就属于自己的行。

如果你正在跟踪用户通过IP:

CREATE TABLE votes (
    voteid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    userip VARCHAR(15) NOT NULL, 
    answerid INT NOT NULL 
); 

此外,这给你的是能够查询在这样的方式您的数据的好处:

/* Get vote count per user */ 
SELECT userip, COUNT(*) FROM votes GROUP BY userip; 

/* Get users who have voted 3 or more times */ 
SELECT userip FROM votes GROUP BY userip HAVING COUNT(*) >= 3; 

要完成同样的事情一个序列化的列,您需要将其查询到应用程序代码中,解析出分隔符,然后执行分析。要在应用程序代码中实现第二个(count> = 3),需要重新实现数据库已经非常擅长的许多事情,例如排序,分组和计数。

0

您应该创建每个不同的项目作为自己的列。

这使访问各个列的复杂程度降低。除了通常对MySQL更高效之外,您的编写查询将不那么复杂。

它还允许您为每列指定不同的类型和长度要求。例如,您可能有一个Integer列和一个Character列,每个列都有不同的存储需求和类型含义。

我建议存储整数列中的IP地址,using the INET_ATON() and INET_NTOA() functions