首页 > 解决方案 > 机器测试数据库的建议数据库模式是否合适?

问题描述

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

我当前的架构如下:

提议的模式

在 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>


标签: sqldatabasedatabase-schema

解决方案


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

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

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


推荐阅读