如何处理'扩展'表

时间:2010-10-02 22:45:07

标签: database-design relational-database

我正在设计一个涉及“页面”的应用程序,它有许多“块”,其中有几种类型的块。我正在努力寻找一种在数据库中保存这些数据的好方法。我想有一种流行的做法,这里有两个我正在考虑的事情:

接近一个

  • 页面表
    • ID
    • 用户
    • 创建,更新等。
    • ID
    • 页面(Blocks.page = Pages.id)
    • 创建,更新
    • block_type(例如“text”)
    • block_id(Blocks.block_id = nBlocks.id,其中n = block_type)
  • 文字块
    • ID
    • 特定于文字的属性

这样做的优点是所有类型的块(创建,更新,页面,标题,顺序)共有的属性都保存在一个地方。您也不必查询每个块类型表来检查当前页面的块,就像使用此“索引”一样。缺点是它在查找块时可能会有点混乱,但这只取决于正确实现它(找到页面的所有块,按块_type分组,在每个block_type上运行查询)。

接近两个

  • 以前的页面
  • 文字块
    • ID
    • 正文,特定于文字的项目
    • 创建,更新,订购
  • 列出块
    • ID
    • 特定于列表的项目
    • 创建,更新,订购等。

这方面的优点是删除了查找正确的表来查询每个块的混乱方式。缺点是无法轻松管理块顺序(update where order in any other block != $order),并且每个表必须具有相同的创建,更新等字段,如果需要更改它们需要付出一些努力。更大的问题是必须为每个页面查询每个特定于块的表,而不仅仅是块表,这些表肯定有页面块。

还有第三种更好的方法吗?我认为最好的方法是第一种方法(它至少比第二种方法规范化,表格逻辑不是 令人困惑)但我想知道是否有一些我缺少的东西: )

1 个答案:

答案 0 :(得分:1)

方法二有一个巨大的骗局:订购。

我会采取方法一,或者: (我知道它看起来很脏,但它确实有效)

  • 页面作为方法一
    • ID
    • BLOCK_TYPE
    • 特定于文字的项目(全部可以为空)
    • 特定于列表的项目(全部可以为空)
    • xxxx特定项目(全部可以为空)
    • 创建,更新,订购

你可以优化它重用一些列

优点:与方法一相同

<强>缺点:

  • 如果你有很多块类型或每种类型的很多特定项目,你会有一个广泛而混乱的阅读表。
  • 一切都是可以为空的,所以你不能确定只看桌子就需要哪些字段


额外提示

如果您计划使用VisualStudio创建应用程序,请使用实体数据模型(.edmx文件),使用“应有的方式”创建具有继承的实体,然后单击“从模型生成数据库”。我相信你的两种方法都有所有优点和缺点。