我有一个人员表,我希望用户能够与他们一起创建多个与多个信息的自定义关系。教育,住宿,就业,语言等。这些可能需要不同数量的列。例如。
Person_languages(person_fk,language_fk)
Person_Educations(person,institution,degree,field,start,end)
我想到了这样的事情。 (不正确的sql)
create Tables(
table_id PRIMARY_KEY,
table_name_fk FOREIGN_KEY(Table_name),
person_fk FOREIGN_KEY(Person),
table_description TEXT
)
包含所有自定义表名称和描述的表
create Table_columns(
column_id PRIMARY_KEY,
table_fk FOREIGN_KEY(Tables),
column_name_fk FOREIGN_KEY(Columns),
rank_column INT,
)
表格包含每个自定义表格中的列及其显示顺序。
create Table_rows(
row_id PRIMARY_KEY,
table_fk FOREIGN_KEY(Tables),
row_nr INT,
)
包含每个自定义表的行的表。
create Table_cells(
cell_id PRIMARY_KEY,
table_fk FOREIGN_KEY(Tables),
row_fk FOREIGN_KEY(Table_rows),
column_fk FOREIGN_KEY(Table_columns),
cell_content_type_fk FOREIGN_KEY(Content_types),
cell_object_id INT,
)
表格保存单元格信息。
如果任何自定义表开始与大多数人一起使用并且变得很大,那么我们的想法是将其提取到一个单独的硬编码的多对多表中,仅用于该表。
这是一个愚蠢的想法吗?有一个更好的方法吗?
答案 0 :(得分:2)
我强烈反对这样的设计 - 你正在走向一个极其分散且难以阅读的设计。
IIUC您的基本问题是,您有一组共同的(通用)属性,可以通过其他(非通用)属性进行扩展。
我通过在person表中使用通用属性来创建另外两个表来解决这个问题:property_types
,它将属性名称转换为INT
主键和{{1}它结合了人PK,权利PK和价值。
如果您将此表的PK设置为person_properties
,您将获得该人员的最佳索引位置,这使得请求所有属性的查询速度非常快。