2009-12-05 97 views
0

我正在創建一個應用程序,用戶可以通過許多不同的方式獲得「積分」。其中一些點應計是由於他們的個人資料,他們採取的行動等而發生的(即分佈在多個表格中)。SQL Server和計算字段?

我不想在某些操作發生時手動在字段中添加點,因爲我想確保號碼的一致性。我想有一些計算字段,可以在一個字段中更新其點數,以便查詢。這是因爲我不想每次我想列出一組用戶和他們的點(如前100名單)時運行一個非常複雜的選擇/查看。

有沒有一種方法可以在多個其他表中使用複雜的select語句計算users表中的字段?它有效嗎?我應該拋開計算機領域,並寫出一個寫得很好的程序嗎?

回答

0

您的方法聽起來很合理,我們通常需要在SQL設計進入生產階段後取消規範化並開始實施。

有很多方法可以做到這一點。下面就來做到這一點使用T-SQL的一種方式:

SELECT 
    u.Id, 
    u.UserName, 
    t.Point_Total 
FROM User u 
INNER JOIN (
    SELECT Id, SUM (Points) AS Point_Total 
    FROM (
     SELECT Id, Points FROM TableA 
     UNION ALL --Be **SURE** to include "ALL" 
     SELECT Id, Points FROM TableB 
     UNION ALL 
     SELECT Id, 5 AS Points FROM SpecialCondition 
    GROUP BY Id 
    ) t ON t.Id = u.Id 

有根據您的模式和數據分佈,所以你必須嘗試和跟蹤性能等諸多方面。

+0

感謝Brett的例子。儘管某些「分數」是以更復雜的方式計算的(例如,在其個人資料中存在某些數據時爲5分)。因此,雖然我不能使用簡單的查詢,但是在構建視圖方面指出了正確的道路...... – Sam 2009-12-05 11:54:23

2

如果它跨越多個表,我會推薦一個視圖,使用這些表或用戶定義的表/標量(取決於您的要求)函數來檢索這些值。

+0

這聽起來像我需要去的方式。謝謝。 – Sam 2009-12-05 11:53:04

0

爲什麼不把點細節保存在一張表中?表格中的行可能與UserId,Item和Points類似 - 因此給定的用戶可能有多行,並且可能會有不同的項目,並且您可以輕鬆地將總計用於報告目的。

關於確保號碼一致性的問題,您可以在交易中進行調整。通過一系列管理數據訪問的存儲過程,這將很容易管理。例如,您提到了5個點,表明他們的配置文件中存在某些數據 - 所以當這些數據添加到他們的配置文件中時,在同一個事務中,您可以將新行插入到Points表中。否則,如果您嘗試使用多個連接來管理這種類型,並且如果您需要經常報告數字,它很可能非常緩慢,非常快。

+0

這很有意義Rick雖然可能需要一些時間,因爲我已經有幾千個現有的記錄要處理,並且因爲在編輯他們的配置文件和刪除數據時也可能會丟失點數(這隻會增加將代碼添加到並擔心忘記其中的一些)。感謝您的時間來回應(剛剛看到您的書...今天會跑到國陣,並檢查出來......大聲笑)。 – Sam 2009-12-05 12:46:25

+0

是的,遷移到新的模式可能是具有挑戰性的,可能並不總是值得的。我很想聽聽你對這本書的看法.... – RickNZ 2009-12-06 02:43:13