2016-07-21 23 views
0

我想允許註冊到我的數據庫的用戶擁有自己的表,用於各種由他們的ID唯一擁有的集合。sqlite - 如何讓註冊用戶擁有集合?

的用戶存儲在:(users :: id -> [id, email])

create table users (
    id integer primary key autoincrement not null unique, 
    email varchar[255] not null  
); 

,他們有一個配置表:

create table profiles (
    id integer unique primary key not null,  
    foreign key(id) references users(id) 
); 

我希望能夠添加各種收藏品的用戶配置文件可以參考,如朋友列表,最喜歡的音樂名稱以及之前使用的密碼哈希列表。

我最初的想法是爲這些集合中的每一個創建一個唯一表,並將配置文件中的表名字段與表的實際名稱關聯起來,但是這個想法看起來非常愚蠢,因爲它使用許多無意義的命名錶。

我也有一個擔心,即使我可以爲每個集合創建一個表,但我不知道如何引用由SQL中另一個表中的字段命名的表,所以我需要執行兩個查詢並處理第一個傳遞給第二個。

  1. 從配置文件表中獲取集合標識。
  2. 訪問表命名查詢1.

的結果是錯誤的感覺也是如此。

是否有另一種將主鍵映射到事物集合而不是創建表的方法?如果不是,我是否應該使用不同的數據庫,如「friend_lists.db」來存儲所有這些表?

提前致謝。

回答

1

你認爲動態創建表是「怪異的」是正確的。我見過很多Stack Overflow人嘗試使用這種反模式。

無論您要將表名稱參數化,移至單個表中的列。

例如,如果你想使用這個模式:

CREATE TABLE user_1234_music(track_name TEXT); 
CREATE TABLE user_5678_music(track_name TEXT); 
CREATE TABLE user_5483_music(track_name TEXT); 
-- and so on 

移動用戶ID列,與外鍵約束,以確保它指向一個有效的用戶。

CREATE TABLE friends(user_id INTEGER REFERENCES users(id), track_name TEXT); 

這樣做有幾個好處:

  • 沒有流行的SQL數據庫引擎支持在表名使用查詢參數,這意味着你必須在值使用字符串操作「通行證」,以表名,將您暴露給SQL注入漏洞。
  • 大多數數據庫都沒有辦法根據查詢結果在不同的表名之間進行動態選擇。列很容易過濾,在WHEREJOIN子句中。
  • 模式更改(添加/刪除列,索引,約束等)只需要在一個表上進行。
  • 數據庫的構建可以擴展到數百萬行。他們沒有足夠的能力來擴展大量的表格(或專欄)。
+0

讓我看看我是否正確理解你。您是否建議將朋友列表存儲在一張表中,並根據您要搜索的朋友進行篩選?例如Bob的朋友和Amy的朋友在同一張桌子上,但是當你在尋找Bob的朋友時,你可以用Bob的ID搜索行。 – Dmitry

+0

它只是覺得將這些數據移動到json文件映射標識符到所有朋友標識符會更具有計算效率,因爲我不確定數據庫是否以某種方式跳過「遍佈數百萬行來找到這個人的100個朋友」並將其優化爲一些更明智的事情,而因爲關係只是數字 - >很多數字,所以把所有的朋友放在一張桌子裏感覺是錯誤的。 – Dmitry

+0

@Dmitry就是這樣。 'SELECT friend_id FROM friends WHERE user_id = bobs_id'。您也可以使用連接:'SELECT users.name FROM friends INNER JOIN users ON users.id = friends.friend_id WHERE friends.user_id = bobs_id'(如果您使用的是JSON,則不能這樣做)。如果您在經常查詢的列上設置了索引,則搜索速度會很快。 –