【问题标题】:Is the proposed database schema for a machine test database suitable? [closed]机器测试数据库的建议数据库模式是否合适? [关闭]
【发布时间】:2019-08-13 14:41:58
【问题描述】:

我正在创建一个数据库来存储机器上的测试结果。我提出的架构是合适的/最好的,还是我完全误解了如何构建数据库?

  • 有不同类型的机器需要不同的测试。
  • 这些测试使用“储备溶液”,这些溶液经过测试并注明日期,以确保它们适合使用。
  • 有些机器有一个注射器,它也经过测试。
  • 所有测试均在孔板中进行,因此我需要记录特定孔板中特定孔的值。
  • 我需要记录谁进行了测试,所以我包含了一个用户表。

我当前的架构如下:

在 XML 中:

(我在这里使用查看器WWW SQL Designer。)

<?xml version="1.0" encoding="UTF-8"?>
<!-- SQL XML created by WWW SQL Designer, https://github.com/ondras/wwwsqldesigner/ -->
<!-- Active URL: https://ondras.zarovi.cz/sql/demo/ -->
<sql>
  <datatypes db="mysql">
    <group label="Numeric" color="rgb(238,238,170)">
      <type label="Integer" length="0" sql="INTEGER" quote="" />
      <type label="TINYINT" length="0" sql="TINYINT" quote="" />
      <type label="SMALLINT" length="0" sql="SMALLINT" quote="" />
      <type label="MEDIUMINT" length="0" sql="MEDIUMINT" quote="" />
      <type label="INT" length="0" sql="INT" quote="" />
      <type label="BIGINT" length="0" sql="BIGINT" quote="" />
      <type label="Decimal" length="1" sql="DECIMAL" re="DEC" quote="" />
      <type label="Single precision" length="0" sql="FLOAT" quote="" />
      <type label="Double precision" length="0" sql="DOUBLE" re="DOUBLE" quote="" />
    </group>
    <group label="Character" color="rgb(255,200,200)">
      <type label="Char" length="1" sql="CHAR" quote="'" />
      <type label="Varchar" length="1" sql="VARCHAR" quote="'" />
      <type label="Text" length="0" sql="MEDIUMTEXT" re="TEXT" quote="'" />
      <type label="Binary" length="1" sql="BINARY" quote="'" />
      <type label="Varbinary" length="1" sql="VARBINARY" quote="'" />
      <type label="BLOB" length="0" sql="BLOB" re="BLOB" quote="'" />
    </group>
    <group label="Date &amp; Time" color="rgb(200,255,200)">
      <type label="Date" length="0" sql="DATE" quote="'" />
      <type label="Time" length="0" sql="TIME" quote="'" />
      <type label="Datetime" length="0" sql="DATETIME" quote="'" />
      <type label="Year" length="0" sql="YEAR" quote="" />
      <type label="Timestamp" length="0" sql="TIMESTAMP" quote="'" />
    </group>
    <group label="Miscellaneous" color="rgb(200,200,255)">
      <type label="ENUM" length="1" sql="ENUM" quote="" />
      <type label="SET" length="1" sql="SET" quote="" />
      <type label="Bit" length="0" sql="bit" quote="" />
    </group>
  </datatypes>
  <table x="863" y="197" name="tests">
    <row name="id" null="1" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="test_name" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="who" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="users" row="id" />
    </row>
    <row name="results" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="volumetric_test_results" row="id" />
    </row>
    <row name="overall_pass" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
  <table x="166" y="300" name="test_names">
    <row name="id" null="1" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="test_name" null="1" autoincrement="0">
      <datatype>VARCHAR</datatype>
      <default>NULL</default>
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
  <table x="1002" y="91" name="machines">
    <row name="serial" null="1" autoincrement="1">
      <datatype>MEDIUMTEXT</datatype>
      <default>NULL</default>
    </row>
    <row name="part_number" null="1" autoincrement="0">
      <datatype>MEDIUMTEXT</datatype>
      <default>NULL</default>
      <relation table="machine_types" row="part_number" />
    </row>
    <row name="syringe" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="syringes" row="serial_number" />
    </row>
    <row name="tests_undertaken" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="tests" row="id" />
    </row>
    <key type="PRIMARY" name="">
      <part>serial</part>
    </key>
  </table>
  <table x="1171" y="17" name="machine_types">
    <row name="part_number" null="1" autoincrement="1">
      <datatype>MEDIUMTEXT</datatype>
      <default>NULL</default>
    </row>
    <row name="description" null="1" autoincrement="0">
      <datatype>MEDIUMTEXT</datatype>
      <default>NULL</default>
    </row>
    <key type="PRIMARY" name="">
      <part>part_number</part>
    </key>
  </table>
  <table x="600" y="302" name="volumetric_test_results">
    <row name="id" null="1" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="plate" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="plates" row="id" />
    </row>
    <row name="criteria" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="volumetric_test_criteria" row="id" />
    </row>
    <row name="pass" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="stock_solution" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="stock_solutions" row="id" />
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
  <table x="363" y="294" name="volumetric_test_criteria">
    <row name="id" null="0" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="test_name" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="test_names" row="id" />
    </row>
    <row name="feature" null="1" autoincrement="0">
      <datatype>MEDIUMTEXT</datatype>
      <default>NULL</default>
    </row>
    <row name="criterion" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="volume" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="unit" null="1" autoincrement="0">
      <datatype>VARCHAR</datatype>
      <default>NULL</default>
    </row>
    <row name="active" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="use_wells" null="1" autoincrement="0">
      <datatype>VARCHAR</datatype>
      <default>NULL</default>
    </row>
    <row name="required_to_pass" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
  <table x="1220" y="435" name="wells">
    <row name="plate" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="plates" row="id" />
    </row>
    <row name="well" null="0" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="absorbance" null="1" autoincrement="0">
      <datatype>DOUBLE</datatype>
      <default>NULL</default>
    </row>
    <key type="PRIMARY" name="" />
  </table>
  <table x="1217" y="285" name="plates">
    <row name="id" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="datetime" null="1" autoincrement="0">
      <datatype>DATETIME</datatype>
      <default>NULL</default>
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
  <table x="623" y="616" name="stock_solutions">
    <row name="id" null="1" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="plate" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="plates" row="id" />
    </row>
    <row name="criteria" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="stock_criteria" row="id" />
    </row>
    <row name="who" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="users" row="id" />
    </row>
    <row name="pass" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
  <table x="398" y="603" name="stock_criteria">
    <row name="id" null="1" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="mean_square_error" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="slope" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="intercept" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="use_wells" null="1" autoincrement="0">
      <datatype>VARCHAR</datatype>
      <default>NULL</default>
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
  <table x="836" y="47" name="syringes">
    <row name="serial_number" null="1" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="tests_undertaken" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="syringe_tests" row="id" />
    </row>
    <key type="PRIMARY" name="">
      <part>serial_number</part>
    </key>
  </table>
  <table x="617" y="105" name="syringe_tests">
    <row name="id" null="1" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="criteria" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="syringe_test_criteria" row="id" />
    </row>
    <row name="who" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="users" row="id" />
    </row>
    <row name="pass" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="plate" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="plates" row="id" />
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
  <table x="365" y="78" name="syringe_test_criteria">
    <row name="id" null="1" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="volume" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="unit" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="use_wells" null="1" autoincrement="0">
      <datatype>VARCHAR</datatype>
      <default>NULL</default>
    </row>
    <row name="feature" null="1" autoincrement="0">
      <datatype>MEDIUMTEXT</datatype>
      <default>NULL</default>
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
  <table x="711" y="771" name="users">
    <row name="id" null="1" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="first_name" null="1" autoincrement="0">
      <datatype>VARCHAR</datatype>
      <default>NULL</default>
    </row>
    <row name="surname" null="1" autoincrement="0">
      <datatype>VARCHAR</datatype>
      <default>NULL</default>
    </row>
    <row name="email" null="1" autoincrement="0">
      <datatype>VARCHAR</datatype>
      <default>NULL</default>
    </row>
    <row name="password_hash" null="1" autoincrement="0">
      <datatype>VARCHAR</datatype>
      <default>NULL</default>
    </row>
    <row name="role" null="1" autoincrement="0">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
      <relation table="roles" row="id" />
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
  <table x="858" y="823" name="roles">
    <row name="id" null="1" autoincrement="1">
      <datatype>INTEGER</datatype>
      <default>NULL</default>
    </row>
    <row name="role" null="1" autoincrement="0">
      <datatype>VARCHAR</datatype>
      <default>NULL</default>
    </row>
    <key type="PRIMARY" name="">
      <part>id</part>
    </key>
  </table>
</sql>


【问题讨论】:

  • 嗨,您上面详细介绍的是系统实体关系图,它详细说明了您所支持的系统中的实体如何相互关联。与其问一个非常笼统的问题,不如阅读关系和规范化以及这将如何最适合您的系统。毕竟只有你会知道什么是最合适的,什么时候规范化,什么时候不规范化等等。

标签: sql database database-schema


【解决方案1】:

很难以您呈现的方式审查某人的设计。但是,我确实注意到了一些基本问题:

  • 您的machines 表(和其他)列,例如您指出的tests_undertaken 类型为int。我不明白这有什么意义。 (见下文)。
  • 您有一个tests 表,但它是针对测试的“类型”还是特定机器上的特定测试运行?如果是前者,那么您应该有一个单独的表,将 tests 表链接到 machines 表,该表包含机器上每个测试运行的记录并链接到测试结果。
  • 您的test_names 表似乎没有必要,因为没有提供任何其他信息,这些信息似乎无法包含在volumetric_test_criteria 表中,只需将名称的id 替换为名称本身即可。您通过制作额外的表节省的空间可能会被始终必须JOIN 这两个表的开销所淹没。

正如其他人所指出的,您应该阅读数据库规范化,但我希望这有助于您入门。

【讨论】:

  • tests_undertaken 列是int,因为它们与特定的测试结果相关,并且可能不止一个……所以我想它们之间应该有一个表,其中包含机器 ID 和将它们关联起来的测试 ID? tests 表用于特定机器上的特定测试。我想这就是我在上面所意识到的。我有test_names 表,因为feature 字段在同一个测试中会有所不同,即我想记录特定测试的精度和准确度。我不确定这是否是正确的方法。
  • 是的,您不想将多个特定测试 ids 存储在单个 tests_undertaken 列中。它行不通。解决方案是删除该列并创建一个 tests_undertaken 表,其中包含测试 id、机器 id 以及存储结果所需的任何列 - 例如日期/时间条目、通过/失败、特定结果等。当然,如果每个测试结果中有多个“测量”,那么您可能还需要一个表格,为每个测试“运行”提供逐行结果。确定这些东西是数据库设计的“艺术”。
猜你喜欢
  • 1970-01-01
  • 2021-02-18
  • 2015-04-06
  • 2013-08-24
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
相关资源
最近更新 更多