SQL Server и вычисляемые поля? - PullRequest
       10

SQL Server и вычисляемые поля?

0 голосов
/ 05 декабря 2009

Я создаю приложение, которое позволяет пользователям зарабатывать «очки» разными способами. Некоторые из этих начислений начисляются из-за их профиля, действий, которые они предприняли и т. Д. (Т. Е. Распределены по нескольким таблицам).

Я не хочу вручную добавлять точки в поле при выполнении определенных действий, потому что я хочу обеспечить согласованность чисел. Я хотел бы иметь какое-то вычисляемое поле, которое обновляет их точки в поле для удобства запросов. Это потому, что я не хочу запускать безумно сложный выбор / просмотр каждый раз, когда хочу составить список пользователей и их точек (например, список 100 лучших).

Есть ли способ вычислить поле в таблице пользователей, используя сложный оператор выбора для нескольких других таблиц? Это эффективно? Должен ли я просто бросить вычисленное поле и пойти с хорошо написанной процедурой?

Ответы [ 3 ]

2 голосов
/ 05 декабря 2009

Если он распространяется по нескольким таблицам, я бы рекомендовал представление с использованием этих таблиц или определяемую пользователем таблицу / скалярную (в зависимости от ваших требований) функцию для получения этих значений.

0 голосов
/ 05 декабря 2009

Почему бы не сохранить детали точек в одной таблице? Строки в таблице могут быть чем-то вроде UserId, Item и Points - таким образом, у данного пользователя может быть несколько строк с различными точками по элементам, и вы можете легко суммировать итоговые значения для целей отчетности.

Что касается вашей заботы об обеспечении согласованности номеров, вы можете просто внести коррективы в транзакцию. Это было бы легко управлять с помощью набора хранимых процедур, которые управляют вашим доступом к данным. Например, вы упомянули 5 баллов за наличие определенных данных в их профиле - поэтому, когда эти данные добавляются в их профиль, в той же транзакции вы ВСТАВЛЯЕТЕ новую строку в таблицу Баллов.

В противном случае, если вы попытаетесь управлять этим видом с помощью нескольких объединений, и если вам нужно будет сообщать о числах очень часто, это может произойти очень медленно, очень быстро.

0 голосов
/ 05 декабря 2009

Ваш подход звучит разумно, часто нам нужно отменять нормализацию конструкций 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

Есть много других способов, зависящих от вашей схемы и распределения данных, поэтому вам придется экспериментировать и отслеживать свою производительность.

...