我想我可以自己解决所有问题,但是...我想我浪费了太多时间... 大家好!我正在为Room数据库结构苦苦挣扎-我不确定我的方法是否正确。我要实现的目标是能够将“服务”(子子类别)添加到“类别”,但是可能还有可选的“子类别”:
类别->服务
类别->可选子类别->服务
我已经做过的事情(跳过了代码的一些基本部分):
a)创建实体
@Entity
class Category
int id
String name
@Entity
class Subcategory
int id
String name
int categoryID
@Entity
class Subcategory
int id
String name
int categoryID
int subcategoryID
b)创建联接表
@Entity
class Join
int id
int categoryID
int subcategoryID
int serviceID
当类别具有任何服务的子类别时,这很简单:
id | categoryId | SubcategoryId| ServiceId|
-------------------------------------------
1 | 1 | 1 | 1 |
1 | 1 | 1 | 2 |
但如果没有子类别并且服务仅属于类别:
id | categoryId | SubcategoryId| ServiceId|
-------------------------------------------
1 | 1 | null | 1 |
我将null
设置为SubcategoryId,并检查子类别是否为空
问题是:这种方法在关系数据库设计方面是否正确?
还是我应该: 1.创建category-subcategory,subcategory-service,category-service联接表,并最终以某种方式将它们连接到一个大联接中? 2.或将categoryId和subcategoryId添加到服务中?
任何评论,技巧和窍门,不胜感激! :)
答案 0 :(得分:1)
除了将其加入到其他关系表中之外,我将使用以下方法:
假设您只有两个类别,一个是主要的(主要类别),第二个是次要的类别(子类别)。
我会在单个表中为 Category
创建实体,如下所示:
@Entity
class Category
int id // It's our primary key here
String name
int parentId // To detect if category is Main/Sub. How? "Null" if Main, "main category" id if child
现在有关 Service
实体:
@Entity
class Service
int id
String name
//This is our foreign key from Category table
int categoryId //It can be Main/Sub category id from "Category" Table, how to detect it's Main/Sub? Check it from category table using "parentId".
为什么采用这种方法?
因为
1服务依赖于类别,因此与服务无关 类别是主/子。它所知道的只是它的类别 本身。
2现在,对于类别,为什么两个都没有单独的表? 因为即使是子类别,我们也需要将其视为 类别(实际上是),因此最好像类别和 为此用一个名为
parentId
的新参数进行区分。
答案 1 :(得分:1)
有一个称为嵌套集的旧设计。这种设计的优点是它相对简单,可以创建任何深度的类别和子类别。查询速度很快,并且可以通过多种方式检索数据:例如,显示级别为4的特定类别的子类别。
缺点之一是查询有些复杂,但是一旦您越过学习曲线,它们就非常直观。
另一个缺点是DML非常昂贵,因此仅在数据建立后非常稳定的情况下才有用。
如果这似乎满足您的需求,我将在this answer中提供更多详细信息以及许多示例代码。