【问题标题】:How to handle 'extending' tables如何处理“扩展”表
【发布时间】:2010-10-03 08:43:42
【问题描述】:

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

方法一

  • 页表
    • 身份证
    • 用户
    • 创建、更新等
  • 方块
    • 身份证
    • 页面(Blocks.page = Pages.id)
    • 创建、更新
    • block_type(例如“文本”)
    • block_id(Blocks.block_id = nBlocks.id 其中 n = block_type)
  • 文本块
    • 身份证
    • 文本特定属性

这样做的好处是所有类型的块(创建、更新、页面、标题、顺序)共有的属性保存在一个地方。您也不必查询每个块类型表来检查当前页面的块,因为您将拥有此“索引”。缺点是在查找块时可能会有点混乱,但这仅取决于正确实现它(查找页面的所有块,按 block_type 分组,对每个 block_type 运行查询)。

接近二

  • 和以前一样的页面
  • 文本块
    • 身份证
    • 页面
    • 正文,特定于文本的项目
    • 创建、更新、订购
  • 列出块
    • 身份证
    • 页面
    • 列表特定项
    • 创建、更新、订购等

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

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

【问题讨论】:

    标签: database-design relational-database


    【解决方案1】:

    方法二有一个巨大的缺点:排序。

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

    • 页面作为方法一
    • 方块
      • 身份证
      • 页面
      • block_type
      • 特定于文本的项目(均可为空)
      • 特定于列表的项目(都可以为空)
      • xxxx 特定项目(都可以为空)
      • 创建、更新、订购

    你可以重用一些列来优化它

    优点:与方法一相同

    缺点:

    • 如果您有很多块类型或每种类型有很多特定项目,您将拥有一个宽泛且难以阅读的表格。
    • 所有内容都可以为空,因此您无法通过查看表格来确定需要哪些字段


    额外提示

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多