使用SQLite

时间:2016-03-02 16:44:01

标签: database sqlite database-design

我正在开发一款需要一些基本数据关联的应用。我已选择SQLite作为我的数据库选择,以简化并在将来在我的应用程序的移动版本中使用它。它有一些限制因此我可能完全错误。

一个简单的方案如下:

我需要为汽车分配类别,以便汽车可以属于多个类别。类别是预定义的。

我的方法:

  1. 三个表:'Cars''Categories''CategoriesAssigned'
  2. 每个'Car'都可以属于多个'Category'
  3. 'CategoriesAssigned'用于将'Categories'映射到'Cars'
  4. 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'添加为昏迷分离:即“Trucks,Luxury,Diesel”,最后解析字符串。但这种感觉更加错误。

1 个答案:

答案 0 :(得分: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的字段,然后是某种分隔列表;我经常看到用于此的管道字符。例如,Ford BigRig的字段可能是

Used|Fast

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