我创建了一个民意调查网站,用户需要注册和投票。我只为用户的信息和提交创建了一个表。下面是表格的列和行:
用户:
columns: username password agree_1 reason_1 agree_2 reason_2
rows: paul testing yes NULL no because i don't like it
我从这里的一位成员那里得到了一个建议,他说我应该这样重组我的桌子:
users
- id
- email
- name
polls
- id
- name
questions
- id
- poll_id
- question
- order
answers
- id
- question_id
- user_id
- answer
请哪个列是主键,哪个是外键。我需要知道一张桌子与另一张桌子的关系。请帮忙。感谢
答案 0 :(得分:2)
更常见的是," id "是该特定表的主键, table1name_id 是该表中与表1相关的外键。
e.g。在您的示例中,每个表的ID是该表的主键,而poll_id
是questions
表中的外键,关联"问题"表与民意调查"表"。
答案 1 :(得分:1)
从技术上讲,这两种方法都是可用的。
问题实际上归结为重用问题。如果您打算将此网站用于其他民意调查,那么您的同事的方法是正确的。
然而,如果这是单拍类型的交易,那么你开始的就好了。
您的方法将导致更少的代码/设置。他将花费更多的时间来吸收EAV模型的复杂性;特别是在报告方面。使用EAV设计构建高性能查询并不适合胆小的人。
肯定存在中间立场。即将登录信息分离到自己的表中并创建"民意调查"答案表只有你关心的4列。这种方法不具备EAV方法的任何灵活性,但符合关于结构的标准DB设计标准,并且当然非常容易组合和查询。
最后,还有第四种选择:只需注册其中一个进行免费投票的网站,而不是编写自己的选项。例如:http://www.micropoll.com/注意:我与他们没有关联,也没有使用他们的产品。这只是一个网站,在2秒的谷歌搜索中出现。
更新 是的,您可以对最初的结构执行简单查询。例如:
计算用户数:
select count(*) from users
计算说是的人数:
是的同意_1:select count(*) from users where agree_1 = 'yes'
两个都是:select count(*) from users where agree_1='yes' and agree_2='yes'
是的:select count(*) from users where agree_1='yes' or agree_2='yes'
计算拒绝的人数:
不同意_1:select count(*) from users where agree_1 = 'no'
两者都不:select count(*) from users where agree_1='no' and agree_2='no'
否:select count(*) from users where agree_1='no' or agree_2='no'
显示
只有评论:select reason_1, reason_2 from users
只有是评论:select reason_1 from users where agree_1 = 'yes'
对于任何一个列中的任何一个列中的评论:
select reason_1 from users where agree_1 = 'yes' union all select reason_2 as reason_1 from users where agree_2 = 'yes'
答案 2 :(得分:0)
使用数据库中的关系来保证数据的验证和规范化,尝试使用不包含冗余数据的结构,那个人建议你开始使用,所有你需要做的就是使用InnoDB引擎来表。 在用户,轮询,问题和答案表中使id为primary,并为外键列添加索引,即(question_id,poll_id,user_id)。 地图
answers.question_id to questions.id
questions.poll_id to polls.id
answers.user_id to users.id
可以在phpmyadmin的关系视图中轻松完成