2016-03-02 59 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