【问题标题】:Boolean and String Values in the same table同一表中的布尔值和字符串值
【发布时间】:2012-03-06 10:40:13
【问题描述】:

我正在设计我的第一个大型项目,我想确保自己走在正确的道路上,所以我想我会由社区来管理它。

我有向公司提交产品的供应商。供应商选择他们想提交给哪家公司,这会带来公司选择的问题页面。到目前为止,我有一张公司表、一张供应商表和一张产品表。每个都有自己的主键,很容易。我的问题在于我的名为提交的表格,它开始为每个新提交将它们捆绑在一起。我试图摆脱包含一千列的提交表,因为这些公司都想提出不同的问题。如果我有

Table Submissions
  submission_id
  date
  product_id FK
  vendor_id FK
  company_id FK

and 

Table Questions
  question_id
  question

and to bridge the many to many

Table Questions_Submissions
  questions_submissions_id
  submission_id  FK
  question_id  FK
  answer

这将是规范化的推荐路径吗?如果是这样,列答案包含布尔和字符串结果是否有任何危害,或者我应该以某种方式将布尔问题分解到另一个表中?我预计未来几年会有数百万行数据,并希望确保我不会从一开始就设计错误。如果您在此设计中看到明显的错误或危险信号,感谢您提供任何反馈。

【问题讨论】:

    标签: mysql database-design data-modeling


    【解决方案1】:

    这当然是一种方法,而且看起来还不错。

    您可以对答案和查询中的一些 if 语句做一些聪明的事情来处理不同类型的答案,但它确实给解决方案增加了一些复杂性,所以您应该考虑一下您要如何处理答案。

    对于布尔值,您可以轻松地在 varchar 字段中使用“true”或“false”,并对它们进行计数。如果您需要直接在查询中获取数字或日期的答案,以求总和或平均值,您可以将答案拆分为类型。

    【讨论】:

    • 谢谢布赖恩。我不确定是否应该考虑布尔值与字符串占用的空间。磁盘空间很便宜,所以如果它不是什么大问题,我宁愿选择真/假,是/否,以避免稍后转换一些代码行。
    【解决方案2】:

    到目前为止,我有一张公司表、一张供应商表和一张产品表。每个都有自己的主键,很简单。

    每一行都有自己的 ID 号。这与通过规范化关系得到的东西并不完全相同。在关系数据库中,重要的不是识别行,而是识别行所代表的内容。

    例如,这张表

    Table Questions
      question_id
      question
    

    很容易得到如下所示的数据。

    question_id  question
    --
    1            What is your name?
    2            What is your name?
    3            What is your name?
    4            What is your name?
    5            What is your name?
    

    每一行都是唯一标识的,但每个问题(重要的)不是。你需要一个对 {question} 的唯一约束。

    我有向公司提交产品的供应商。

    Table Submissions
      submission_id
      date
      product_id FK
      vendor_id FK
      company_id FK
    

    您需要对 {product_id, vendor_id, company_id} 或 {date, product_id, vendor_id, company_id} 设置唯一约束。

    您还需要一个供应商产品表。您的表格允许供应商向公司提交任何产品(包括他们不销售的所有产品)。

    供应商选择他们想提交给哪家公司,这会带来公司选择的问题页面。 (强调)

    您的架构中没有任何内容存储公司选择的问题。

    列答案包含布尔值和字符串结果有什么害处

    您几乎可以将任何常见的数据类型表示为字符串。但是使用这种结构,您不能将布尔值限制为两个值。如果您添加数字结果的可能性,您也不能将它们限制为合理的值。

    【讨论】:

    • 非常感谢您的反馈。正是我希望社区能够提供的响应类型。
    猜你喜欢
    • 1970-01-01
    • 2014-03-30
    • 2019-10-15
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2012-08-10
    • 2011-12-31
    相关资源
    最近更新 更多