【问题标题】:Database structure with OneToOne annotations具有 OneToOne 注释的数据库结构
【发布时间】:2014-12-27 03:27:08
【问题描述】:

我正在编写一个 web 应用程序,但不知道应该采用以下两种方式中的哪一种。 想象一下 5 个表:A、B、C、D 和 E。

选项 1: 使用 ids 作为外键,然后它看起来像这样:
tableA:id、field1、field2、...
tableB:tableA_id、field1、field2、...
tableC:tableB_id、field1、field2、...等...

选项 2: 创建将用作外键的新列,然后它看起来像这样:
tableA:id、field1、field2、...
tableB:idtableA_id、field1、field2、...
tableC:idtableB_id、field1、field2、...等...

我认为当我们调用实际上名为 tableA_id 的 tableB id 字段时,选项 1 可能有点令人困惑,但我可能错了,所以如果有人能启发我一点,我会很高兴。
另外,如果选项 2 是要走的路,那么在主键上加入表有什么意义?

编辑:我想要实现的目标是这样的:
帐户
...字符
......项目
......留言
......其他的东西

【问题讨论】:

  • 您是否要为树建模?
  • 我不这么认为。我只是想弄清楚哪种方式是正确的方式。在我的情况下,有一个帐户表恰好包含 1 个字符,例如项目表、消息等

标签: mysql database database-design relational-database


【解决方案1】:

我猜是“选项 2”,但您可能需要更具体地说明您的目标。我可以建议一个选项 3:

 TableX: id, A_id, B_id, C_id, D_id, E_id

然后:

Table_A: id, col1, col2
Table_B: id, colX, colY
Table_C: id, thing1
Table_D: id, more_col
Table_E: id, xxx

那么,就是一个简单的join:

 SELECT A.col1, B.colX, C.thing1, D.more_col, E.xxx
    FROM TableX X
    LEFT JOIN Table_A as A on X.A_id = A.id
    LEFT JOIN Table_B as B on X.B_id = B.id
    .
    .
    .

【讨论】:

  • 这是一个有趣的解决方案,但在 Spring 数据中,我不手动执行任何 SQL,而是使用适当的函数调用存储库,而 hibernate 为我执行此操作,因此我必须调用表X一直。我还更新了我想要实现的目标。
【解决方案2】:

我最终创建了新列作为外键(选项 2),只是因为它不那么令人困惑。
不过谢谢你的建议,我很感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多