MySQL数据库,用户使用自定义列号创建表

时间:2012-12-20 09:59:53

标签: mysql database database-design

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

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,
                  )

表格保存单元格信息。

如果任何自定义表开始与大多数人一起使用并且变得很大,那么我们的想法是将其提取到一个单独的硬编码的多对多表中,仅用于该表。

这是一个愚蠢的想法吗?有一个更好的方法吗?

1 个答案:

答案 0 :(得分:2)

我强烈反对这样的设计 - 你正在走向一个极其分散且难以阅读的设计。

IIUC您的基本问题是,您有一组共同的(通用)属性,可以通过其他(非通用)属性进行扩展。

我通过在person表中使用通用属性来创建另外两个表来解决这个问题:property_types,它将属性名称转换为INT主键和{{1}它结合了人PK,权利PK和价值。

如果您将此表的PK设置为person_properties,您将获得该人员的最佳索引位置,这使得请求所有属性的查询速度非常快。