我有一个人表,我希望用户能够与他们创建定制的多对多信息关系。教育、住所、就业、语言等。这些可能需要不同数量的列。例如。
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,
)
包含单元格信息的表格。
如果任何自定义表格开始被大多数人使用并且变得很大,我们的想法是也许然后将它提取到一个单独的硬编码多对多表格中,只用于该表格。
这是一个愚蠢的想法吗?有一个更好的方法吗?
最佳答案
我强烈反对这样的设计 - 你正在走向一个极其分散且难以阅读的设计。
IIUC 你的基本问题是,你有一个人的一组通用(通用)属性,可以通过其他(非通用)属性进行扩展。
我会通过在 person 表中使用通用属性来解决这个问题,并创建另外两个表:property_types
,它将属性名称转换为 INT
主键和person_properties
,结合了人物PK、属性PK和值(value)。
如果您将此表的 PK 设置为 (person,property)
,您将获得该人的最佳索引位置,这使得请求一个人的所有属性成为非常快速的查询。
关于MySQL 数据库,带有用户创建的带有自定义列号的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13969525/