2

外鍵關係我是一個MySQL的新手,並正在尋找解決以下問題:Mysql的推導出隨機查詢

我想創建一個CMS與cppcms這應能有模塊。既然我想減少(意外)訪問私人數據的機會,我想要一個處理數據訪問和權限的模塊。由於該模塊應該不知道其他模塊創建的數據結構,因此我希望它通過外鍵推斷出數據所有者的關係。我的想法是搜索將行連接到用戶標識的路徑(通過外鍵)。

綜上所述: 我所試圖做的

  1. 以隨機查詢,確定受影響的行
  2. 爲受影響的行確定戀愛關係/路徑(通過外鍵)到用戶/用戶ID(現有表中的列)
  3. 僅返回可確定關係並滿足條件的行(例如,在相關查詢中找到的用戶ID與固定用戶ID匹配,例如當前正在訪問的用戶系統)

(據我所知的外鍵只執行另一個表中的鍵的存在,但前提我假設是,每一個行鏈接到用戶通過外鍵關係的路徑)

我的問題/問題:

  1. 是否有該問題的現有解決方案/更好的方法?編寫的語句不會做伎倆,因爲我不提前知道所有的數據結構/查詢。

  2. 如何獲得外鍵關係?除了「SHOW CREATE TABLE」並解析結果字符串之外,還有其他方法嗎?

  3. 如何確定會受到影響的行,而無需修改它們?我想通過確定是否可以將它鏈接到當前用戶(不是mysql用戶,但是系統用戶)來過濾此集。

我能嘗試執行查詢,然後選擇影響行,如果我決定訪問衝突根本就回滾?問題在於:如何對合法行的子集進行更改(例如,我試圖更改5行,可能只更改2,如何更改這2行)。一個想法是搜索一種方式來創建一個結果集的臨時表;這個解決方案有幾個缺點:外鍵關係不適合臨時表,它們是'丟失'的。

P.S .:我在C++中編碼,所以我寧願cpp兼容庫的建議,但我打開其他建議。雖然谷歌搜索我偶然發現了教條,Iam正在研究它。 P.P.S:數據庫引擎InnoDB的是(有,因爲外鍵)

UPDATE:第2部分的說明嘗試: 我試圖濾除collumns允許用戶查看錶。爲此,我想通過外鍵在數據庫中找到連接(通過外鍵我確保我可以通過連接獲取所有數據,並且它們是我必須加入的列的提示)。由於我計劃在一個更復雜的系統(例如論壇)上,我不想在臨時表中加入所有數據並對這些數據運行用戶查詢。我寧願評估用戶查詢並檢查結果,如果我可以將它與用戶標識的連接進行映射。例如,我可以使用這個來強制只爲用戶創建的帖子啓用編輯按鈕。 (我知道有更簡單的方法可以做到這一點,但我基本上希望允許程序員編寫自己的查詢,而不必讓他們有機會編輯或查看他們不允許看到的數據。我的假設是程序員不是妖孽,但只是忘記了限制,因此我想用軟件強制它們)。

到達這裏會很不錯,但我有一點複雜的需求。

首先是一個基本的例子。讓我們說,它像Facebook和一個人的所有朋友都可以看到他的照片。

pictures = id **userid** file (bool)visibleForFriends album 
friendship = **userid1** **userid2** 
users = userid 

我希望發生的是:

  1. 編程輸入 「SELECT * FROM圖片WHERE專輯= 2」
  2. 系統得到所有匹配的記錄(如IDS的設置)
  3. 系統看到外鍵用戶ID,嘗試將當前用戶ID與圖片用戶ID匹配,將所有匹配添加到返回的結果部分
  4. 系統通知特殊個visibleForFriends
  5. 系統試圖determin所有朋友(SELECT userid1 FROM友誼WHERE userid2 = currentUserID加入(已閱讀了關於聯接)SELECT userid2 FROM友誼WHERE userid1 = currentUserID)
  6. 系統將所有行,其中visibleForFriends是true和pictures.userid =從5結果。

儘管友誼部分是一些額外的代碼鍵來查看連接。忽略了特殊的友誼情況下(特殊情況下),我希望系統在這方面努力,以及:

pictures = id **albumid** file (bool)visibleForFriends album 
albums = id **userid** 
users = userid 

目前,該系統應該去照片。 albumid ==> albums.id - > albums。 userid ==> users.userid。

我希望這些例子能澄清一下這個問題。一個問題是,從示例中的第一點(程序員查詢輸入),我不想讓「DELETE *」對不屬於用戶的任何東西生效。所以我必須過濾哪些行才能真正刪除。

回答

1

在回答你的答案(第1部分)的一部分,爲您提供訪問數據庫的MySQL用戶有權訪問information_schema那麼你可以使用下面的查詢,瞭解一個特定的數據庫中現有的外鍵關係:

SELECT 
    TABLE_NAME, 
    COLUMN_NAME, 
    REFERENCED_TABLE_NAME, 
    REFERENCED_COLUMN_NAME 
FROM 
    information_schema.KEY_COLUMN_USAGE 
WHERE 
    TABLE_SCHEMA = 'dbname' AND REFERENCED_COLUMN_NAME IS NOT NULL; 

我對第2部分有些困惑,我不確定如何對本節作出適當的迴應。我希望你在你的項目中發現上面的查詢很有幫助!

+0

非常感謝,我會盡快回到我的數據庫。我試圖在我的問題中給出一個例子(從大膽的更新向下) – ted 2011-12-29 19:49:47

0

是否存在解決方案/解決問題的更好方法?

是的,我認爲是。您正在描述一個多租戶數據庫。在用戶共享表(也稱爲「共享所有」)的多租戶數據庫中,每個表都應該有一個用於用戶標識的列。實際上,每一行都知道它的主人。

這將極大地簡化您的SQL,因爲您不需要連接來確定行所屬的人。它也可能會加速你的SQL。

This SO answer有一個體面的問題和選擇的總結。

+0

我認爲它略過不同的多租戶後略讀文章。人們不會考慮Facebook作爲多租戶還是我誤解? (朋友和所有者可以訪問某些數據,而所有人都可以看到其他數據)。感謝指針。 – ted 2012-01-06 15:14:48