投票问题 - 将投票存储为序列化而不是多行

时间:2012-03-13 17:30:56

标签: mysql

我的问题是:什么是最好的方法 存储用户的投票包括新的mysql行中的ip和answer id或者在答案行中仅使用ine字段包括所有投票作为“序列化”数据 而如果 存储此序列化数据的文件类型是什么

2 个答案:

答案 0 :(得分: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),需要重新实现数据库已经非常擅长的许多东西,比如排序,分组和计数。

答案 1 :(得分:0)

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

这使得访问单个列的复杂性降低得多。除了通常对MySQL更有效之外,查询对你来说也不会那么复杂。

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

我建议将IP地址存储为整数列using the INET_ATON() and INET_NTOA() functions