代码之家  ›  专栏  ›  技术社区  ›  hIpPy

如何设计不固定表列的架构

  •  1
  • hIpPy  · 技术社区  · 15 年前

    我正试图设计一个不固定表列的模式。例:我有一个Employee表,表中的列不是固定的和可变的(Employee的属性不是固定的和可变的)。需要经常添加新的属性/列。

    1. Employee表本身中可以为空的列,即没有规范化

    2. 不要添加可以为空的列,而是将这些列在各自的表中分开,例如:如果地址是要添加的列,则创建表地址[EmployeeID,AddressValue]。

    3. 创建表extensioncolumnname[employeeid,columnname]和extensioncolumnnvalue[employeeid,columnvalue]。extensionColumn名称将columnname作为“地址”,extensionColumnValue将columnValue作为地址值。

      员工表
      职工身份证
      名字

      扩展列名称表
      柱状目
      职工身份证
      字段名

      扩展列值表
      职工身份证
      柱状目
      柱值

    当模式随着每个新属性的改变而改变时,前两种方法有一个缺点。请注意,添加一个新属性是经常发生的,也是一项要求。

    我不确定这是好是坏的设计。如果有人要做出类似的决定,请提供有关外键/数据完整性、索引、性能、报告等方面的见解。

    6 回复  |  直到 8 年前
        1
  •  2
  •   OMG Ponies    15 年前

    我建议使用数字2和3的组合。在可能的情况下,为标准关联(如地址)建模表。这是最理想的方法…

    但是,对于无法汇总成这样逻辑分组的不断变化的值,除了使用 EMPLOYEES 表:

    • 员工属性类型代码(两列, employee_attribute_type_code 和说明)
    • Employee_属性(三列:Employee_id foreign key to employees、Employee_attribute_type_code foreign key to employee_attribute_type_codes和value)

    EMPLOYEE_ATTRIBUTES ,设置要使用的主键:

    • 雇员身份证
    • 员工属性类型代码

    这将停止同一员工的重复属性。

        2
  •  3
  •   Peter Tillemans    15 年前

    查看nosql数据库的当前裁剪可能很有用,它允许您为每条记录存储任意的键值对集。

    我建议你看看CouchDB、MongoDB、Lucene等……

    如果架构经常在SQL数据库中更改,那么这将导致一场噩梦,尤其是报告。

    将所有内容放入(rowid、key、value)三元组是灵活的,但由于记录数量巨大,因此速度较慢。

    ERP供应商这样做的方式只是建立他们确定的字段的模式,并在固定命名列中添加大量的“flexfields”(即20个数字、20个字符串等),然后使用查阅表查看哪个flexcolumn对应于什么。这允许将来有一定的灵活性,同时基本上有一个静态模式。

        3
  •  1
  •   Joe Stefanelli    15 年前

    如您所说,如果经常添加新属性, EAV 数据模型可能对您很有用。

        4
  •  1
  •   Community CDub    8 年前

    有一种模式,称为观察模式。

    有关解释,请参阅以下问题/答案: one. >, , two. >, , three.

    一般来说,如下所示:

    例如,受试者 Employee,Company and Animal can all have observation name (trait),受试者 Employee and Animal can have observation weight (measurement)and subject beer bottle can have observations label (trait)and volume (measurement)。这一切都适合这个型号。

    , two , three .

    一般来说,如下所示:

    observation_model_02

    例如,主题 员工、公司和动物 都能观察到吗 名字 (特征),受试者 员工和动物 可以观察 重量 (测量)和受试者 啤酒瓶 可以观察到 标签 (性状) 体积 (测量)。这一切都符合模型。

        5
  •  0
  •   Jim Garrison    15 年前

    将扩展列表组合为一个

    Property:
        EmployeeID foreign key
        PropertyName string
        PropertyValue string
    

    如果使用单调序列在所有对象表中分配主键,则单个属性表可以保存所有对象的属性。

        6
  •  0
  •   BillThor    15 年前

    我将使用1和2的组合。如果您经常添加属性,我认为您没有处理数据需求的能力。

    我支持添加的一些属性属于另一个表。如果您继续添加诸如Java认证、ASP认证、……之类的属性,那么您需要一个证书表。这可以是与列出可用证书的证书代码表的关系。

    像manager这样的属性可以是属性或关系表。如果员工之间有多个关系,那么考虑一个具有关联类型的关系表。具有矩阵管理结构的组织将需要一个发布表。

    地址和电话号码通常放在单独的表格中。一个地址键,如雇员ID,地址类型,将是适当的。如果需要历史记录,请在键中添加开始日期列。

    如果您保留历史记录,我建议在适当的列上使用开始日期和结束日期列。当“开始日期”为真时,我尝试使用记录处于活动状态的关系。 重量、眼睛颜色等属性。