将字符串和外键存储在一列中

时间:2013-01-14 02:39:39

标签: mysql relational-database

我正在构建一个包含大量类别的网站,每个类别都有自己的特定表单字段。因为有这么多类别,我想将这些表单字段存储在数据库中。

  1. 类别存储在category表中:

    id | name
    -------------
    1  | Car info
    
  2. 该类别的字段存储在category_field表中:

    id | fk_id_category | type  | label
    -------------------------------------------------------------
    1  | 1              | text  | Your name
    2  | 1              | radio | What type of car do your drive?
    
  3. 如果category_field有一些用户可以选择的预定义选项,那么这些选项会存储在category_field_option表中:

    id | fk_id_category_field | label
    -----------------------------------------
    1  | 2                    | 'Convertible'
    2  | 2                    | 'Truck'
    3  | 2                    | 'Minivan'
    
  4. 现在,当用户填写表单时,我们要在form_entry表中保存对此的引用:

        id | fk_id_user | fk_id_category
        --------------------------------
        1  | 1          | 1
    

    该表单条目的详细信息保存在form_entry_details表中。但是:

    • 如果category_field.typetext,我们应该将答案保存为字符串

      id | fk_id_form_entry | fk_id_category_field | [answer]
      -------------------------------------------------------
      1  | 1                | 1                    | John Doe
      
    • 如果category_field.typeradio,我想将外键保存到category_field_option

      id | fk_id_form_entry | fk_id_category_field | [fk_id_category_field_option]
      --------------------------------------------------------------------------
      2  | 1                | 2                    | 2
      

    我该如何解决这个问题?我知道我可以将fk_id_category_field_option存储为字符串,但我需要它实际引用category_field_option表,因为我使用的是ORM(Doctrine 1.2.4)。

1 个答案:

答案 0 :(得分:0)

你不能因为外键的整个想法是为了防止这种情况。您可以将其存储为一个字段而不强制执行外键,或者创建两个列,一个用于外键id(可能是与“用户定义”相关的默认值),另一个用于获取用户定义的信息,可能还有默认值为空。