我正在为一家医院制作一个包含生物样本数据的库存系统。我正在使用SQLite作为数据库。这个系统应该可以理想地用于各种研究。
由于每个研究和每个用户都将有不同的字段,以及他们各自研究所需的不同数量的字段,我想使这些字段用户可配置,而不是静态的。我想到的一种添加此功能的方法是允许用户创建一个“研究”,该研究将在内部创建一个专门用于该研究的SQL表。用户可能有多个研究,并且因此可能具有与其账户相关联的多个完整的“表”。
我该如何着手完成这件事呢?我在下面附上了截图,最终我想向用户展示的是什么。
假设用户参与了主页上显示的3项不同研究,点击研究1后会看到:
同样,对于研究2和3:
多个用户可能是多个研究的一部分。我知道我可以用一个中间的多对多关系来完成这一点。
我的主要问题是,如何为不同的案例设置不同数量的字段?目前我能想到的唯一方法是在每次用户创建新案例时创建一个SQL表。不过,我知道这不是最佳实践。谢谢。
1条答案
按热度按时间xurqigkl1#
可以吗我觉得这是个禁忌。
禁忌没有,但与规范化和良好使用关系数据库的关系方面相反。
当你有一个属于其他东西的东西的变化列表时,那么两个具有合适关系的表就可以处理。
您提到一项研究具有不同数量的字段,因此有2个表study和field,字段可以与研究具有多对1的关系。因此,研究可以具有0-多个字段(显然,空研究没有什么用处)。
因此,开始时您可以:-
您提到了用户,因此需要一个用户表,例如
你提到了与一个字段相关的样本,也提到了与一个用户相关的样本,并且每个字段(属于一个研究)每个用户有多少样本是可变的。
多对多关系通常(仅?)由中间表(具有各种名称,如关联表、Map表、引用表...)提供。这样的表至少有两列,一列与其中一个表相关,另一列与另一个表相关。主键通常是这两列的组合。简而言之,您可以具有:-
REFERENCES
用于添加一个约束(规则),以防止无效值(孤立值)。不强制要求具有这样的约束(但建议使用)。CASCADES
将父表(被引用表)上的动作级联到子表(所有者)。因此,使用上面你可以添加一些数据,如:-
取第一个值(500,800,11.11)。这
等等。
现在考虑以下SELECT查询作为示例:
结果是(加上上述数据):
从用户视点(即使用
ORDER BY user.userid, study.studyid
按用户ID排序),则完全相同的数据将生成:-