2016-03-02 58 views
0

我正在研究需要一些基本数据关联的应用程序。我选择SQLite作为我的数据库选择,以便于将来在移动版本的应用程序中使用它。它有一定的局限性,所以我可能完全错误。使用SQLite构建数据库

一个简单的场景是如下:

我需要与指定类别的汽车,使得汽车可以是多个类别的一部分。类别是预定义的。

我的方法:

  1. 三个表:'Cars''Categories''CategoriesAssigned'
  2. 每个'Car'可以属于多个'Category'
  3. 'CategoriesAssigned'用于映射'Categories''Cars'

SQLite端创建三个表:

CREATE TABLE Cars(
    Id INT PRIMARY KEY  NOT NULL, 
    Name TEXT NOT NULL, 
); 

CREATE TABLE Categories(
    Id INT PRIMARY KEY  NOT NULL, 
    Name TEXT NOT NULL, 
); 

CREATE TABLE CategoriesAssigned(
    Id INT PRIMARY KEY NOT NULL, 
    CategoryId INTEGER NOT NULL, 
    CarId INTEGER NOT NULL, 
    FOREIGN CategoryId(Id) REFERENCES Categories(Id), 
    FOREIGN CarId(Id) REFERENCES Cars(Id), 
); 

因此,我可以有许多'Category'每个'Car'。我不喜欢的是会有很多重复的数据,像'Category'会重复许多车。

我对数据库仍然很陌生,想获得一些关于如何正确处理这种情况的建议和反馈。

更新:

有一种另一种方式,这是我个人讨厌:

CREATE TABLE Cars(
     Id INT PRIMARY KEY  NOT NULL, 
     Categories TEXT, 
     Name TEXT NOT NULL, 
    ); 

    CREATE TABLE Categories(
     Id INT PRIMARY KEY  NOT NULL, 
     Name TEXT NOT NULL, 
    ); 

,然后添加'Categories'昏迷分离:即“汽车,豪华,柴油”,最后解析串。但不知怎的,这感觉更加错误。

回答

1

看起来你在这里有一个多对多的关系,所以中间表是干净的关系数据库设计的正确方法。你说你会有重复的数据,但我认为你的意思是你会有一张表,看起来很重复,而事实上每行都是唯一的。

如果你有车:

1. Buick Whatever 
2. Ford BigRig 
3. Chevy Sprite 
4. Toyota Thimble 
5. Nissan Panther 

分类:

1. Fast 
2. Economical 
3. Used 

然后CategoriesAssigned可能是:

1. 1 (Buick), 2 (Economical) 
2. 3 (Chevy), 2 (Economical) 
3. 4 (Toyota), 2 (Economical) 
4. 2 (Ford), 3 (Used) 
5. 4 (Toyota), 3 (Used) 
6. 2 (Ford), 1 (Fast) 
7. 3 (Chevy), 1 (Fast) 

所以当这种情况持续下去,有很多在这两个重复列但没有两行是相同的。

人们可以在没有中间表的情况下处理这种情况的另一种方式是向Cars称为Categories的字段添加一个字段,然后该字段是某种分隔列表;我通常会看到用于此的管道字符。例如,对于福特BigRig的字段可以是

Used|Fast

好处是少SQL。缺点是您必须手动过滤数据而不是直接查询。

+0

从可维护性和性能的角度来看,哪种方式更受欢迎? – eYe

+0

我的首选是将数据中的任何数据以粒度的方式存储在数据库中,这意味着有连接表。但是,这取决于你打算如何使用这个领域。如果您想通过某个类别搜索和分析数据,则将其作为数据库字段有助于运行Group By查询。另一方面,如果它是不太重要的领域,它可能不保证SQL连接的麻烦。考虑帖子上的标签 - 我们可以关联无数个标签,但我可能不需要其他数据库表。也许我只是查询包含SQLlite的所有标签。 – OptimisticToaster