MySQL数据库,具有用户创建的带有自定义列号的表

MySQL数据库,具有用户创建的带有自定义列号的表,mysql,database,database-design,Mysql,Database,Database Design,我有一个person表,我希望用户能够创建自定义的多对多信息关系。教育、居住、就业、语言等等。这些可能需要不同数量的列。例如 Person_languages(person_fk,language_fk) Person_Educations(person,institution,degree,field,start,end) 我想到了这样的事情。(sql不正确) 包含所有自定义表名称和说明的表 create Table_columns( column_

我有一个person表,我希望用户能够创建自定义的多对多信息关系。教育、居住、就业、语言等等。这些可能需要不同数量的列。例如

Person_languages(person_fk,language_fk)
Person_Educations(person,institution,degree,field,start,end)
我想到了这样的事情。(sql不正确)

包含所有自定义表名称和说明的表

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\u types
,它将属性名称转换为
INT
主键,以及将person PK、property PK和value组合在一起的
person\u properties


如果您将此表的主键设置为
(person,property)
,您将获得person的最佳索引位置,这使得请求person的所有属性成为一个非常快速的查询。

+1下面是一个说明故事:
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,
                  )