生物采样数据库的初级设计

hpy*_*hpy 5 database-design

作为一个完全新人,我想根据我实验室多年来积累的生物数据来练习设计一个数据库。这是一个解释(我正在简化/抽象我们正在做的事情以使第一个数据库更简单):

每个实地考察季节,我们都会去测量不同地理位置的树木(例如高度、树干直径等)。多年来,每棵树和每个位置都会被多次访问和测量。然而,由于实际限制,我们可能无法每个季节访问和测量所有地点的所有树木。

数据库的目的有两个:

(1) 跟踪每棵树随时间的变化,提出以下问题:“树 A 在过去两年中长高了吗?”

(2) 跟踪每个位置的树木数量如何随时间变化,提出以下问题:“在过去三年中,Acme Acres 的 12 棵树群总体上是否长得更高?”

这是我对制作表格的初步想法:

(a) 树:字段:TreeID(例如“树 A”)、位置(链接到下面的表 c)。

(b) 访问:这会保留每次访问的元数据,包括访问日期(对于某个位置,该位置的所有树木都相同)、我们在访问期间覆盖的位置等信息。

(c) 位置:每个位置的基本信息,例如纬度、经度、位置名称(例如“Acme Acres”)等。

(c) TreeData:这包含单个树木的实际测量值。字段可能包括:树(链接到表 a)、高度、直径、访问(链接到表 b)。最后,这里的任何一棵树都会有多个条目,以及每次访问的数据。

作为数据库设计的第一次尝试,这些是否有意义?(我才考虑数据库三天)

我将不胜感激并虚心接受您能给我的任何指示。

非常感谢!

顺便说一句,我考虑使用访问表的一个原因是有时我可能会比较访问 3 和 4 之间的数据,或者访问 1 和 5 之间的数据,等等

DFo*_*k42 4

我会将 TreeData 重命名为测量值。

另外,除非您确实需要访问表,否则我不会使用它。如果设计得当,如果您包含访问表,您的数据库将如下所示:

树形数据库设计

使用访问表会使您想要回答的一些查询变得复杂。例如,要回答第一个问题,您可以在 sql server 中使用类似以下内容:

select
     t.treeid,
     max(m.height)-min(m.height) as Growth
from trees t
     inner join measurements m
          on t.treeid=m.treeid
     inner join visits v
          on m.visitid=t.visitid
where v.date>=dateadd(y,-2,getdate())
group by t.treeid
Run Code Online (Sandbox Code Playgroud)

如果没有访问表,您可以像这样重写:

select
     m.treeid,
     max(m.height)-min(m.height) as Growth
from measurements m
where m.date>=dateadd(y,-2,getdate())
group by m.treeid
Run Code Online (Sandbox Code Playgroud)