【问题标题】:How to design the table for following use case?如何为以下用例设计表格?
【发布时间】:2023-03-16 06:20:01
【问题描述】:

我有两张桌子,widgettier。一家公司可以属于任何一层(tier1、tier2、tier3),并且每一层都启用了一些小部件。例如,第 1 层启用了 3 个不同的小部件,第 2 层有 3 个自己不同的小部件,第 1 层的 3 个小部件也总共有 6 个,第 3 层以同样的方式启用了总共 9(3+3+3)个小部件。

Company 表有一个tier_id 作为外键。

我的小部件和层表描述如下:

CREATE TABLE IF NOT EXISTS `mydb`.`widget` (
 `id` INT NOT NULL,
 `name` VARCHAR(100) NOT NULL,
 `tier_id` INT NULL,
 PRIMARY KEY (`id`),
 INDEX `fk_widget_tier_idx` (`tier_id` ASC),
 CONSTRAINT `fk_widget_tier`
 FOREIGN KEY (`tier_id`)
 REFERENCES `mydb`.`tier` (`id`)
 ON DELETE NO ACTION
 ON UPDATE NO ACTION)
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `mydb`.`tier` (
 `id` INT NOT NULL,
 `name` VARCHAR(45) NOT NULL,
 PRIMARY KEY (`id`))
ENGINE = InnoDB

现在假设一家公司属于第 3 层,我该如何设计数据库,以便在获取第 3 层小部件的值时,它会获取所有 9 个小部件?如果我将公司与层和小部件表连接起来,我将只获得第 3 层中包含的 3 个小部件。如何获取其余 6 个小部件(第 1 层和第 2 层)。

我正在使用 java + hibernate 来处理数据库。我是否需要在代码中手动执行此操作,例如检查层级,然后创建此类小部件的列表并返回它?

我希望这个问题很清楚,而不是一个非常基本的问题(害怕投反对票)。

【问题讨论】:

  • 您的加入条件应该是大于或小于而不是等于。

标签: mysql database hibernate


【解决方案1】:

如果我理解得很好,你有:

tear1 -> tear1_widgets

tear2 -> tear1_widgets + tear2_widgets

tear3 -> tear1_widgets + tear2_widgets + tear3_widgets

在您的情况下,我将遵循分层模型。我会将上述层次结构保存在一个表中,以便了解每个实例(在您的情况下为“撕裂”),实例从中继承其属性(在您的情况下为“小部件”)。因此,每次您有一个条目类型“tear3”时,您都知道它必须有 9 个小部件,并且您必须从哪里(tear1、tear2 和 tear3)获取它们。

在上面的示例中,您可以看到您知道可以从哪个表继承您的小部件,并且您只需编写查询即可将它们带入。

加上特定的设计,您可以将实例(眼泪)与您想要的任何小部件组合在一起。

*添加图片

【讨论】:

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