【问题标题】:so lost in designing those tables !在设计这些桌子时迷失了方向!
【发布时间】:2010-12-12 16:41:11
【问题描述】:

我早些时候发布了这个问题,但我没有得到任何答案!我会尝试改写它并使其更清晰,希望得到有用的建议。

我想构建一个允许用户构建自己的表单的应用程序。

用户可以在表单中输入数据并查询数据。

表单在创建和使用后可以进行编辑(添加/删除字段)。

表单可以包含以下字段:小文本框、大文本框、单个列表、复选框、下拉菜单 ....

我想根据字段的类型将字段分组到表中...(文本框将在一个表中分组,下拉列表在另一个表中 等等)。

我想设计我的表,这样如果我决定以后升级我的应用程序并添加一个新类型,我就不必改变我的模式!例如,如果一开始我只允许用户使用文本框和下拉菜单,那么稍后,我升级我的应用程序并添加一个新类型:“复选框”!我希望用户能够编辑其表单并向其添加复选框,而无需更改架构。

所以我在想(请在这里帮助我)拥有:

1- 每个 FIELD 都有 (ID-Name-Position- 值) 2- 每个 FIELD 都只有一种 TYPE 3-每种类型都可以是其中之一(字符串-数字-日期-二进制-短) 4-每个FIELD可以有一个或多个多个项目 5-如果FIELD有多个项目,那么肯定它有“一个选定的项目”

(4 和 5 用于覆盖下拉菜单字段)。

所以我最终得到了 3 张桌子:

FIELD TABLE 和 TYPE 表和 MUTLIPLE ITEMS 表。

这是正确的吗?如果我想添加一个新的“字段”怎么办..这样做可以吗?请帮忙,我真的很新!我一直在拉我的头发,我无法解决这个问题!

【问题讨论】:

  • 最好编辑您之前的问题并解决 cmets 中的要点,而不是将副本作为新副本发布(即使已经进行了一些编辑)。请这样做并删除这个。
  • How to design these two tables? 的可能重复项
  • 感谢您的回复,但我担心如果您这样做没有人会看它,因为它已经有很多视图并且没有答案:(我真的需要帮助.. :( 怎么办你建议?如果你想让我删除它,我会

标签: database database-design entity dynamic-data relational-database


【解决方案1】:

这个有点难回答,因为要求:

文本框将被组合在一起 在一张表中,下拉列表 另一张桌子...

...如果我决定升级我的 稍后申请并添加一个新的 类型,我不必改变我的架构..

有冲突。

因此,如果您不想更改架构,请查看 this question/answer

如果您愿意稍微修改架构,请查看模型。在此模型中,您必须为每个新元素类型添加一个新表,但不必修改任何现有表。 将所有常用字段放入Element 表中,仅将特定字段放入TextBox, List, CheckBox, ...

此外,表单元素大多是标准的——即使应用程序当前不支持它们,您现在也可以将它们全部列出并简单地创建所有表。这样您就很少需要修改架构。

【讨论】:

    【解决方案2】:

    我将如何设计它以避免数据冗余:

    formTable
    ---------
    id             varchar(36)
    name           varchar(36)
    creationDate   date
    lastUpdate     date
    isActivated    boolean
    ...
    ...
    
    componentTable
    --------------
    id     varchar(36)
    name   varchar(36)
    ...
    ...
    ...
    
    formComponentTable
    ------------------
    form_id       varchar(36)
    component_id  varchar(36)
    
    
    metadataTitleTable
    -----------------
    id       varchar(36)
    name     varchar(36)
    
    metadataValueTable
    ------------------
    id       varchar(36)
    name     varchar(36)
    
    metadataTable
    -------------
    metadata_id varchar(36)
    title_id    varchar(36)
    value_id    varchar(36)
    
    metadataComponentTable
    ----------------------
    component_id varchar(36)
    metadata_id  varchar(36)
    

    现在让我解释一下我的看法。

    您在formTable 中插入了一个表单,其中包含您需要的所有数据。日期、所有者等...

    表单由多个组件组成。 formComponentTable 将表单与组成它的各种组件绑定。然后metedata*Table 将让您描述所有组件。

    我不明白您为什么要为每种组件创建一个表。为什么不添加一个列来定义它是哪种类型。你明白吗?

    嗯,我认为这应该是您开始思考设计的良好开端。

    如果您需要更多帮助,请不要犹豫添加 cmets,

    编辑:在这种情况下,内容可以被视为元数据。因此,您将在metadataTitleTable 中有一个集合,即content,然后在metadataValueTable 中有一个集合,即实际的content,然后您只需将所有内容绑定在一起。

    【讨论】:

    • 感谢您的回复,我不确定我是否理解您的设计...您能给我一个示例,说明如何存储文本框的内容、下拉菜单和单个如果我是你设计的用户,请列出?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2012-09-27
    • 2021-06-25
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多