【问题标题】:structuring a database table构建数据库表
【发布时间】:2013-01-21 04:29:10
【问题描述】:

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

用户:

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

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

【问题讨论】:

  • @ceejayoz:也许对于我们这些已经存在一段时间的人来说;但是,我猜 OP 是非常新的。这是一个有效的问题。
  • 如果有人问一个问题,“应该是显而易见的”作为答案是毫无价值的,也是侮辱性的。

标签: php mysql database phpmyadmin


【解决方案1】:

更多情况下,“id”是该特定表的主键table1name_id外键 在将该表与表 1 相关联的表中。

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

【讨论】:

    【解决方案2】:

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

    问题归结为重用问题。如果您打算将此网站用于额外的民意调查,那么您的同事的做法是正确的。

    但是,如果这是单发类型的交易,那么您开始的方式就可以了。

    您的方法将减少很多代码/设置。他将花费更多时间让您了解 EAV 模型的复杂性;尤其是在报告方面。使用 EAV 设计构建高性能查询并不适合胆小的人。

    当然有一个中间立场。即将登录信息分离到它自己的表中,并创建一个“投票”答案表,其中只包含您关心的 4 列。这种方法不具备 EAV 方法的任何灵活性,但符合有关结构的标准 DB 设计标准,并且肯定非常容易组合和查询。

    最后,还有第四种选择:不用自己编写,只需在提供免费投票的网站之一上注册即可。例如:http://www.micropoll.com/ 注意:我不隶属于他们,也没有使用过他们的产品。这只是一个在 2 秒谷歌搜索中弹出的网站。


    更新由于 cmets 是的,您可以针对您最初拥有的结构执行简单的查询。例如:

    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. 显示
      只有 cmets:select reason_1, reason_2 from users
      只有是 cmets: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'

    【讨论】:

    • 谢谢。该网站不会用于额外的投票。我想做到这一点,这样我就可以实现以下目标:计算用户数量,计算说是的人数,计算说不的人数,仅显示 cmets。我可以用上面的第一个表结构来实现吗?
    【解决方案3】:

    在数据库中使用关系保持数据验证和规范化,尝试使用不包含冗余数据的结构,那个人建议你开始使用,你所要做的就是使用 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 的关系视图中轻松完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2021-01-13
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多