如何为以下用例设计表格?

时间:2014-09-13 09:45:55

标签: mysql database hibernate

我有两个表,widgettier。公司可以属于任何一个层(tier1,tier2,tier3),并且每个层都启用了一些小部件。对于ex - tier1启用了3个不同的小部件,第2层有3个不同的小部件,3个小部件的tier1也使6个,tier3以相同的方式启用了总共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层,我如何设计数据库的方式是当我获取tier3的小部件值时,它会抓取我所有9个小部件?如果我使用tier然后使用widgets表连接公司,我将只获得3个小部件,这些小部件包含在第3层中。如何获得其余的6个小部件(第1层和第2层)。

我使用java + hibernate来处理数据库。我是否需要在代码中手动获取此内容,如检查层的级别,然后创建此类小部件的列表并将其返回?

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

1 个答案:

答案 0 :(得分:0)

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

撕裂1 - > tear1_widgets

tear2 - > tear1_widgets + tear2_widgets

tear3 - > tear1_widgets + tear2_widgets + tear3_widgets

在你的情况下,我会遵循分层模型。我会将上面的层次结构保存在一个表格中,以便了解每个实例(在您的情况下'撕裂')从哪些实例继承其属性(在您的情况下'小部件')。所以,每当你有一个输入类型' tear3'你知道它必须有9个小部件,你必须从那里(tear1和tear2和tear3)。

enter image description here

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

另外,通过特定的设计,您可以拥有实例(眼泪)以及任何您想要的小部件组合。

*添加了图片