我正在创建一个模拟结果数据库,并试图以正确的方式进行。我试图展示数据之间的关系,以确保没有多余的东西被扔进去。
我目前的结构是这样的:
实验
主键:SimulationID
表:
- 测量
- 采样率
- first_draft_flow_rate
- second_draft_flow_rate
- final_flow_rate
与这些表相关的外键:cycle_count
每个表都包含变量的主键、外键和值。
因此,对于给定的实验,它运行了这么多周期(它运行的周期数因模拟而异)。我们在模拟的每个周期记录数据。
我已经制作了一个名为measurement
,sampling_rate
等的表,但不确定如何命名这些列。也应该称为measurement
,sampling_rate
等吗?或者我应该只Value
用作列名?
这是一个带有示例日志的电子表格,用于演示我正在使用的内容。所有这些数据都将归档在一个SimulationID
.
此外,任何关于如何最好地将数据库设计为正常/最佳实践的提示将不胜感激。
我的偏好是将列命名为
final_flow_rate__value
等,因为value
如果有多个列这样命名,它本身很容易变得非常混乱。举个例子:
结果将显示列标题都只是
value
.以下返回更有意义的列标题:
作为负责调试他人代码的 DBA,我特别讨厌数据库中的每个代理键都
ID
在引用表和引用表中命名xxx_ID
。例如:这种模式会导致难以调试的模式,例如:
实际上应该是:
如果表定义为:
跨表使用相同的名称,这个错误几乎不会发生,因为如果实施“错误”版本将很明显,并且可能永远不会首先错误地实施:
更易读的正确版本是:
跨表包含相同内容的列应该在定义它们的每个表中命名完全相同,即使只是为了减少负面遗留问题。
这不是数据库管理,这是数据建模。非常不同的学科。
我猜你的主要实体是模拟,你列出的表格描述了它。您没有显示这些表格的结构或内容,因此以下内容基于猜想。
测量看起来可能是测量类型的列表:温度、流量、每单位体积的粒子等。 SamplingRates 也看起来像有效速率的列表:1/sec、10/sec、100/sec 等。
最后有三个看起来应该是一个的表,FlowRates,这也是一个查找表。
这意味着模拟是记录的结果,例如,以 30 毫升/秒的流量每秒 10 次的速率读取温度。
那准确吗?如果是这样,这将是一个示例:
因此,示例模拟条目将显示测量值 1、采样率 2 和流量 3——当然还有测量结果,可能还有执行模拟时的时间戳。
如果您对实验进行简单的语言描述,这将有很大帮助:“实验由任意数量的模拟组成。模拟由……以特定频率基于……的各种读数组成。”不要考虑表格和列。假设您正在与实验室技术人员交谈。
更新:在设计表时(这与命名字段有关),将实体与所有其他实体隔离通常是一个好主意——也就是说,命名应尽可能与上下文无关。这意味着如果您有一个表示实体名称或描述的字段,那么请务必将这些字段称为“名称”和“描述”。无论您在分散在数据库中的表中是否有许多其他具有相同名称的字段。
表没有上下文。它是建立上下文的查询。
这里有三个表,每个表都有字段名称——一个表被使用两次并不重要。在每个表中,Name表示“这是该行表示的实体的名称”。
此查询建立的上下文很容易识别。它正在查看所有新创建站点的所有者和管理者,并重命名每个名称字段以适应上下文。不同的查询可以并且确实在完全不同的上下文中使用这些字段。由于设置上下文的是查询,因此让查询将字段重命名为最适合该上下文的任何内容。
不要尝试通过命名字段 User_ID 或 User_Name 等来强制使用表的上下文。在查询中,字段应该以表名或别名作为前缀,因此不会有任何混淆。
与之比较
额外的“User_”没有添加任何有用的信息。此外,你一定会遇到这样的事情:
我只是打字一次就累死了。此外,一些 DBMS 限制对象名称的长度。Oracle iirc 只考虑对象名称的前 32 个字符。在使用tablename_fieldname约定的商店中,我不止一次达到了这个限制。在这一点上,您必须使用非常混乱的缩写。
无论如何,“最佳实践”是一个相当主观的概念。意见会有所不同。选择最适合您的。
始终尝试提前考虑,尽可能使用自记录(不言自明)的表和字段名称。不要只是把一堆字母串在一起,然后假设后面的人会知道他们在看什么。在这个问题上命名也可以更容易地查看查询返回的结果。