-1

我创建了一个投票网站,用户是用来注册和投票的。我只为用户信息和评论创建了一个表。下面是表格的列和行:

用户:

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

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

4

3 回答 3

2

更常见的是,“ id ”是该特定表的主键,而table1name_id是该表中将该表与 table1 相关联的外键。

例如,在您的示例中,每个表的 id 是该表的主键,并且是将“问题”表与轮询“表”相关联的表中poll_id的外键。questions

于 2013-01-21T04:36:12.680 回答
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'

于 2013-01-21T04:40:13.857 回答
0

在数据库中使用关系保持数据验证和规范化,尝试使用不包含冗余数据的结构,那个人建议你很好地开始,你所要做的就是使用 InnoDB 引擎表。在用户、投票、问题和答案表中使 id 为主,并为外键列添加索引,即(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 的关系视图中轻松完成

于 2013-01-21T04:41:46.027 回答