gpt4 book ai didi

android-studio - 如何在房间数据库上创建同一实体的多个表?

转载 作者:行者123 更新时间:2023-12-05 03:32:07 25 4
gpt4 key购买 nike

问题

假设您有多个花园,每个花园种有不同数量的植物。你的工作是不时检查每个花园的每株植物。每次访问时,您都必须注释植物的某些属性,例如浇水是否良好和高度。该应用程序旨在在这些访问期间提供帮助。

我的方法

我想使用房间数据库。因此,我创建了一个实体 GardenVisit,它具有唯一的 ID 和访问日期。然后我需要一个 GardenAnnotation 实体。该实体将为花园中的每株植物排成一排,并在访问当天标注其 ID 和特征。我考虑过为每个 GardenVisit 创建一个表,并以一对一的关系将它们链接起来,但我找不到实现此目的的方法。

为什么我要为每次 GardenVisit 创建一个 GardenAnnotation 表?

在应用程序中,您可以删除花园参观。因此,在删除它时,它也应该删除它的 GardenAnnotation 表。这似乎是拥有此功能的最简单方法。

结论

如何在房间数据库中创建同一实体的多个表并将它们与另一个表链接?

如果您有更好的方法,我将不胜感激。实际上,为同一个实体创建很多表感觉很奇怪。

最佳答案

为了拆分基本相同的布局(模式)而使用多个表可能意义不大,而且可能会使事情复杂化。

根据您的描述,您有一些共同点:-

  • 花园。
  • 植物。
  • 访问
  • 特质。
  • 注释(每次访问的发现/特征)。

我会相应地建议表格。

Garden 表可能有但可能不限于花园的人类标识符(Kew,巴比伦空中花园......)(因为它已经存在并且有效) 标识符 (id)。

Plant 表(蒲公英、玫瑰......),其中包含关于植物的 ID、名称和其他信息的列。

将植物映射/链接/关联到花园的表格(未提及),允许多对多关系(一个花园可以有很多植物,一个植物可以在多个花园中使用)。 2 列,一列是通往花园的 map ,另一列是植物的 map 。

Visit 表,其中包含访问的日期/时间(也许是开始/结束)以及 map /链接……到花园。

Trait 表,例如浇水好,死了(如果我正在照料植物)....列将是 id 和 trait(确切的要求)

一个注释表,它将链接到访问(因此也是花园)并链接到花园内的植物以及指向要分配的特征的链接。

因此模式可以基于 SQLite(以演示数据库/关系如何从 SQLite pov 工作):-

DROP TABLE IF EXISTS annotation;
DROP TABLE IF EXISTS trait;
DROP TABLE IF EXISTS visit;
DROP TABLE IF EXISTS garden_plant_map;
DROP TABLE IF EXISTS garden;
DROP TABLE IF EXISTS plant;

CREATE TABLE IF NOT EXISTS garden (garden_id INTEGER PRIMARY KEY, garden_name TEXT UNIQUE);
INSERT INTO garden (garden_name)
VALUES('Kew' /* id will be 1 */),('Hanging Gardens of Babylon' /* id will be 2 and so on (probably)*/)
;

CREATE TABLE IF NOT EXISTS plant(plant_id INTEGER PRIMARY KEY, plant_name TEXT UNIQUE);
INSERT INTO plant (plant_name)
VALUES('Rose' /* id will be 1 etc*/),('Dandelion'),('Poppy'),('Azelia'),('Oak'),('Beech')
;
CREATE TABLE IF NOT EXISTS garden_plant_map (
garden_map INTEGER,
plant_map INTEGER,
PRIMARY KEY (garden_map,plant_map)
FOREIGN KEY (garden_map) REFERENCES garden(garden_id) ON DELETE CASCADE ON UPDATE CASCADE
FOREIGN KEY (plant_map) REFERENCES plant(plant_id) ON DELETE CASCADE ON UPDATE CASCADE
);
INSERT INTO garden_plant_map
VALUES
(1 /* Kew */, 3 /* Poppy*/),
(1 /* Kew */, 1 /* Rose */),
(2 /* Babylon */, 2 /* Dandelion */),
(2,5),(2,6) /*Oak and Beech for Babylon */
;
CREATE TABLE IF NOT EXISTS trait (trait_id INTEGER PRIMARY KEY, trait_description UNIQUE);
INSERT INTO trait (trait_description)
VALUES ('Well watered'),('Dead'),('Stressed'),('Flourishing'),('under watered')
;
CREATE TABLE IF NOT EXISTS visit (
visit_id INTEGER PRIMARY KEY,
garden_map INTEGER,
start_of_visit TEXT /* will be date in yyyy-mm-dd hh:mm:ss format*/,
end_of_visit TEXT,
visit_done INTEGER, /* 0/false or 1 (or greater)/true */
FOREIGN KEY (garden_map) REFERENCES garden(garden_id) ON DELETE CASCADE ON UPDATE CASCADE
);

INSERT INTO visit (garden_map,start_of_visit,end_of_visit,visit_done)
VALUES
(1,'2020-01-01 08:00','2021-01-01 10:00',true)
,(1,'2021-01-01 08:00','2021-01-01 10:00',false)
,(2,'2021-02-01 08:00','2021-02-01 10:00',false)
,(1,'2021-03-01 08:00','2021-03-01 10:00',false)
,(2,'2021-04-01 08:00','2021-04-01 10:00',false)
;

CREATE TABLE IF NOT EXISTS annotation (
annotation_id INTEGER PRIMARY KEY,
visit_map INTEGER REFERENCES visit(visit_id) ON DELETE CASCADE ON UPDATE CASCADE,
trait_map INTEGER REFERENCES trait(trait_id) ON DELETE CASCADE ON UPDATE CASCADE,
garden_plant_map_garden_map INTEGER, garden_plant_map_plant_map INTEGER,
FOREIGN KEY (garden_plant_map_garden_map,garden_plant_map_plant_map) REFERENCES garden_plant_map(garden_map,plant_map)
);

INSERT INTO annotation (visit_map, trait_map, garden_plant_map_garden_map, garden_plant_map_plant_map )
VALUES
(1 /* visit on 1/1/20 */, 1 /* Well watered */, 1 /* Kew */, 3 /* Poppy */ )
, (1 /* visit on 1/1/20 */, 5 /* under watered */, 1 /* Kew */, 1 /* Rose */ )

, (3 /* visit on 1/2/21 */, 2 /* dead */, 2 /* Babylon */, 2 /* Dandelion */ )
, (3 /* visit on 1/2/21 */, 4 /* flourishing */, 2 /* babylon */, 6 /* Beech */ )
, (3 /* visit on 1/2/21 */, 3 /* stressed */, 2 /* babylon */, 5 /* Beech */ )
;

SELECT
garden_name,
start_of_visit,end_of_visit, visit_done,
plant.plant_name,
trait.trait_description,
CASE WHEN visit_done THEN 'Completed' ELSE 'ToDO' END AS status
FROM annotation
JOIN visit ON visit.visit_id = annotation.visit_map
JOIN garden ON visit.garden_map = garden.garden_id
JOIN plant ON garden_plant_map_plant_map = plant_id
JOIN trait ON trait_map = trait_id
;

查询结果为:-

enter image description here

假设 id 为 1 的访问被删除(尽管您可能认为 visit_done 为真有效删除(因此您总是可以及时返回))例如使用:-

DELETE FROM visit WHERE visit_id = 3;

然后相同的查询返回:-

enter image description here

即访问 3 的三个注释已被删除

忽略删除,即 visit_id 为 3 的访问剩余,那么表格看起来像:-

花园

enter image description here

植物

enter image description here

特质

enter image description here

访问

enter image description here

花园植物 map

enter image description here

注释

enter image description here

关于android-studio - 如何在房间数据库上创建同一实体的多个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70533333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com