具有类别(可选子类别)和子子类别(服务)的数据库

时间:2018-10-01 17:03:49

标签: android database-design android-room

我想我可以自己解决所有问题,但是...我想我浪费了太多时间... 大家好!我正在为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添加到服务中?

任何评论,技巧和窍门,不胜感激! :)

2 个答案:

答案 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中提供更多详细信息以及许多示例代码。