构造数据库表

时间:2013-01-21 04:29:11

标签: php mysql database phpmyadmin

我创建了一个民意调查网站,用户需要注册和投票。我只为用户的信息和提交创建了一个表。下面是表格的列和行:

用户:

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

请哪个列是主键,哪个是外键。我需要知道一张桌子与另一张桌子的关系。请帮忙。感谢

3 个答案:

答案 0 :(得分:2)

更常见的是," id "是该特定表的主键 table1name_id 是该表中与表1相关的外键

e.g。在您的示例中,每个表的ID是该表的主键,而poll_idquestions表中的外键,关联"问题"表与民意调查"表"。

答案 1 :(得分:1)

从技术上讲,这两种方法都是可用的。

问题实际上归结为重用问题。如果您打算将此网站用于其他民意调查,那么您的同事的方法是正确的。

然而,如果这是单拍类型的交易,那么你开始的就好了。

您的方法将导致更少的代码/设置。他将花费更多的时间来吸收EAV模型的复杂性;特别是在报告方面。使用EAV设计构建高性能查询并不适合胆小的人。

肯定存在中间立场。即将登录信息分离到自己的表中并创建"民意调查"答案表只有你关心的4列。这种方法不具备EAV方法的任何灵活性,但符合关于结构的标准DB设计标准,并且当然非常容易组合和查询。

最后,还有第四种选择:只需注册其中一个进行免费投票的网站,而不是编写自己的选项。例如:http://www.micropoll.com/注意:我与他们没有关联,也没有使用他们的产品。这只是一个网站,在2秒的谷歌搜索中出现。


由于评论,

更新 是的,您可以对最初的结构执行简单查询。例如:

  1. 计算用户数:
    select count(*) from users

  2. 计算说是的人数:
    是的同意_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'

  3. 计算拒绝的人数:
    不同意_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'

  4. 显示
    只有评论: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的关系视图中轻松完成