leb*_*olo 27 database oracle plsql database-schema entity-attribute-value
我想使用实体 - 属性 - 值(EAV)方法创建患者/样本元数据表.
问:我应该如何处理的不同列类型的值(如字符串,数字,或外键的字典表)的基础上的属性?
注意:我不是在问是否使用EAV方法.我查看了其他SO问题和参考资料,并认为这是我用例的最佳方法(例如,我不想为每个属性创建一个单独的列或表- 可以数百个).但是,我会在一个全面的例子中重新考虑其他设计.
患者/样品(实体)可以有多个元数据属性(例如实验室位置,存活,肿瘤类型)每一个具有不同值的类型(例如VARCHAR,NUMBER,FOREIGN_KEY*,分别地).
*FOREIGN_KEY表示该值类型是一个外键ID( INTEGER)到的词典表的值(例如10种可能肿瘤类型的列表).因此,实验室位置可能VARCHAR因为我不关心这些值的标准化.但是肿瘤类型应该有一定程度的验证.
我的表格布局可能如下所示:
CREATE TABLE patients (
patient_id INTEGER CONSTRAINT pk_patients PRIMARY KEY,
patient_name VARCHAR2(50) NOT NULL
);
CREATE TABLE metadata_attributes (
attribute_id INTEGER CONSTRAINT pk_metadata_attributes PRIMARY KEY,
attribute_name VARCHAR2(50) NOT NULL,
attribute_value_type VARCHAR(50) NOT NULL -- e.g. VARCHAR, NUMBER, or ID
);
CREATE TABLE patient_metadata (
patient_id CONSTRAINT fk_pm_patients REFERENCES patients(patient_id) NOT NULL,
attribute_id CONSTRAINT fk_pm_attributes REFERENCES metadata_attributes(attribute_id) NOT NULL,
attribute_value ???
);
Run Code Online (Sandbox Code Playgroud)
我相信在metadata_attributes表中需要一个值类型标识列(attribute_value_type)来知道要查找的列/表.
这是我能想到的两种可能的方法.
为patient_metadata表创建三个不同的列 - 每个值对应一个值类型.
CREATE TABLE patient_metadata (
patient_id CONSTRAINT fk_pm_patients REFERENCES patients(patient_id) NOT NULL,
attribute_id CONSTRAINT fk_pm_attributes REFERENCES metadata_attributes(attribute_id) NOT NULL,
attribute_varchar_value VARCHAR(50),
attribute_number_value NUMBER,
attribute_id_value CONSTRAINT fk_pm_values REFERENCES some_table_of_values(value_id)
);
Run Code Online (Sandbox Code Playgroud)
创建三个不同的patient_metadata表 - 每个值类型一个.
CREATE TABLE patient_metadata_varchar (
patient_id CONSTRAINT fk_pm_patients REFERENCES patients(patient_id) NOT NULL,
attribute_id CONSTRAINT fk_pm_attributes REFERENCES metadata_attributes(attribute_id) NOT NULL,
attribute_value VARCHAR(50) NOT NULL
);
CREATE TABLE patient_metadata_number (
patient_id CONSTRAINT fk_pm_patients REFERENCES patients(patient_id) NOT NULL,
attribute_id CONSTRAINT fk_pm_attributes REFERENCES metadata_attributes(attribute_id) NOT NULL,
attribute_value NUMBER NOT NULL
);
CREATE TABLE patient_metadata_id (
patient_id CONSTRAINT fk_pm_patients REFERENCES patients(patient_id) NOT NULL,
attribute_id CONSTRAINT fk_pm_attributes REFERENCES metadata_attributes(attribute_id) NOT NULL,
attribute_value CONSTRAINT fk_pm_values REFERENCES some_table_of_values(value_id) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
还有其他方法吗?
简而言之,我希望尽可能地尊重关系完整性,并允许数据库知道值类型,以便它可以执行基本验证.但是,我相信上述两种方法都需要某种类型的手动完整性检查(方法1需要检查是否只填充了一个attribute_value列,等等).
该类型的我将执行将是典型的查询(例如检索的列表的值对于给定的元数据属性,检索的列表的值对于给定的患者(实体)和元数据属性等).我相信在大多数情况下我需要查询值类型,以便知道要查询的列或表.还有其他方法吗?
所有方法(性能,查询结构等)的优缺点是什么?
第一次海报,所以提前感谢,请随时评论格式或进一步说明!
这是一个众所周知的问题。您提到的方法的问题在于,您需要在查询属性之前知道属性的类型。这不是世界末日,因为您管理元数据,但仍然......
两种可能的解决方案可能是
varchar2数据类型以已知格式表示所有数据类型。数字和字符没有问题,日期值可以以预定义的方式写入(就像to_String()在任何 OO 设计中实现一样)。ANYDATA
数据类型。我个人尝试过它,但决定不使用它。| 归档时间: |
|
| 查看次数: |
5632 次 |
| 最近记录: |