sql - 机器测试数据库的建议数据库模式是否合适?
问题描述
我正在创建一个数据库来存储机器上的测试结果。我提出的模式是合适的/最好的,还是我完全误解了如何构建数据库?
- 有不同类型的机器需要不同的测试。
- 这些测试使用“储备溶液”,这些溶液经过测试并注明日期,以确保它们适合使用。
- 有些机器有一个注射器,它也经过测试。
- 所有测试都在孔板中进行,因此我需要记录特定孔板中特定孔的值。
- 我需要记录谁进行了测试,所以我包含了一个用户表。
我当前的架构如下:
在 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 & 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>
解决方案
很难以您呈现的方式审查某人的设计。但是,我确实注意到了一些基本问题:
- 您指示的
machines
表(和其他)列tests_undertaken
是类型int
。我不明白这有什么意义。(见下文)。 - 你有一张
tests
桌子,但它是针对“类型”的测试还是在特定机器上运行的特定测试?如果是前者,那么您应该有一个单独的表,该tests
表将该machines
表链接到包含机器上每个测试运行的记录的表,并且还链接到测试结果。 - 您的
test_names
表格似乎没有必要,因为没有提供其他信息,似乎无法通过简单地将名称替换为名称本身来包含在volumetric_test_criteria
表格中。通过制作额外的表所节省的空间可能会被这两个表id
的开销所淹没。JOIN
正如其他人指出的那样,您应该阅读数据库规范化,但我希望这有助于您入门。
推荐阅读
- javascript - 为什么第一次输入单词后jquery textcomplete无法正确找到其他单词?
- jenkins - 在 jenkins 的 github pull request 中添加评论
- javascript - 当可观察更新时,选择的选项不会更新,尽管 optionsValue 确实
- c - 如何在c中使用自定义类型从节点列表中读取数据结构
- ios - Facebook iOS 分享对话框崩溃
- php - WordPress Yoast Focus 关键字未更新
- django - `FileNotFoundError`:当发出`python manage.py collectstatic`
- r - 在 r 中使用 if 语句进行 dcast
- shell - linux shell中的echo命令中的错误?
- automated-tests - 在第一个未通过的测试中中止 ExUnit