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