作为一个完全新人,我想根据我实验室多年来积累的生物数据来练习设计一个数据库。这是一个解释(我正在简化/抽象我们正在做的事情以使第一个数据库更简单):
每个实地考察季节,我们都会去测量不同地理位置的树木(例如高度、树干直径等)。多年来,每棵树和每个位置都会被多次访问和测量。然而,由于实际限制,我们可能无法每个季节访问和测量所有地点的所有树木。
数据库的目的有两个:
(1) 跟踪每棵树随时间的变化,提出以下问题:“树 A 在过去两年中长高了吗?”
(2) 跟踪每个位置的树木数量如何随时间变化,提出以下问题:“在过去三年中,Acme Acres 的 12 棵树群总体上是否长得更高?”
这是我对制作表格的初步想法:
(a) 树:字段:TreeID(例如“树 A”)、位置(链接到下面的表 c)。
(b) 访问:这会保留每次访问的元数据,包括访问日期(对于某个位置,该位置的所有树木都相同)、我们在访问期间覆盖的位置等信息。
(c) 位置:每个位置的基本信息,例如纬度、经度、位置名称(例如“Acme Acres”)等。
(c) TreeData:这包含单个树木的实际测量值。字段可能包括:树(链接到表 a)、高度、直径、访问(链接到表 b)。最后,这里的任何一棵树都会有多个条目,以及每次访问的数据。
作为数据库设计的第一次尝试,这些是否有意义?(我才考虑数据库三天)
我将不胜感激并虚心接受您能给我的任何指示。
非常感谢!
顺便说一句,我考虑使用访问表的一个原因是有时我可能会比较访问 3 和 4 之间的数据,或者访问 1 和 5 之间的数据,等等
我会将 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)