1

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

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

保存单元格信息的表格。

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

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

4

1 回答 1

2

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

IIUC 你的基本问题是,你有一个人的一组通用(通用)属性,可以通过其他(非通用)属性扩展。

我将通过在 person 表中使用通用属性并创建另外两个表来解决这个问题:property_types,它将属性名称转换INT为主键,person_properties并结合了 person PK、propety PK 和 value。

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

于 2012-12-20T10:05:19.063 回答