Соглашения по псевдонимам таблиц / подзапросов SQL - PullRequest
2 голосов
/ 12 марта 2012

Я пишу SQL уже несколько лет на различных СУБД (Oracle, SQL Server, MySQL, Access и т. Д.), И одна вещь, которая меня всегда поражала, это, по-видимому, отсутствие соглашения об именах, когда речь заходит о таблицах.& псевдонимы подзапроса.

Я всегда читал, что альтернативы таблиц - это путь, и хотя я не всегда использовал их, когда я делаю, я всегда зацикливаюсь на том, какие имена использовать.Я перешел от использования описательных имен к отдельным символам, таким как 't', 's' или 'q', и вернулся снова.Возьмем, к примеру, этот запрос MS Access, который я только что написал, я все еще не совсем доволен псевдонимами, которые я использую, даже с таким относительно простым запросом, как этот, я все еще не думаю, что это так просто читать:

SELECT stkTrans.StockName
    , stkTrans.Sedol
    , stkTrans.BookCode
    , SUM(IIF(stkTrans.TransactionType="S", -1 * stkTrans.Units, 0)) AS [Sell Shares]
    , SUM(IIF(stkTrans.TransactionType="B", stkTrans.Units, 0)) AS [Buy Shares]
    , SUM(IIF(stkTrans.TransactionType="B", -1 * stkTrans.Price, 0) * stkTrans1.Min_Units) + SUM(IIF(stkTrans.TransactionType="S", stkTrans.Price, 0) * stkTrans1.Min_Units) AS [PnL]
    , "" AS [Comment]
FROM tblStockTransactions AS stkTrans 
INNER JOIN (SELECT sT1.BookCode
                    , sT1.Sedol
                    , MIN(sT1.Units) AS [Min_Units]
            FROM tblStockTransactions sT1
            GROUP BY sT1.BookCode, sT1.Sedol
            HAVING (SUM(IIF(sT1.TransactionType="S", 1, 0)) > 0
            AND SUM(IIF(sT1.TransactionType="B", 1, 0)) > 0)) AS stkTrans1 ON (stkTrans.BookCode = stkTrans1.BookCode) AND (stkTrans.Sedol = stkTrans1.Sedol)
GROUP BY stkTrans.BookCode, stkTrans.StockName, stkTrans.Sedol;

Что вы думаете?Я подумал, что выкину его туда, чтобы узнать, что другие чувствуют по этому поводу.

Ответы [ 3 ]

2 голосов
/ 12 марта 2012

Мне не известны какие-либо канонические правила стиля для именования псевдонимов таблиц / запросов в разных базах данных, хотя я понимаю, что Oracle рекомендует сокращения от трех до четырех символов.

Я бы обычно избегал однобуквенных аббревиатур, , за исключением , где запрос достаточно прост, чтобы он был абсолютно недвусмысленным для любого, кто должен поддерживать код - обычно не более две или три таблицы на запрос.

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

В представленном примере псевдоним sT1 внутри встроенного представления совершенно не нужен, поскольку в этом встроенном представлении доступна только одна таблица. Это оставляет одну таблицу присоединенной к одному встроенному представлению (на основе той же таблицы) в запросе - в этих обстоятельствах я бы использовал s в качестве псевдонима для таблицы и s1 в качестве псевдонима для встроенного представления ( чтобы указать, что он запрашивал ту же базовую таблицу базы данных).

0 голосов
/ 28 января 2015

DT1 и DT2, кажется, хороший подход. Я нахожусь в фазе понимания существующих Процедур, и некоторые Процедуры используют это соглашение об именах DT1, DT2. Это становится довольно простым для понимания ... вместо того, чтобы дать какое-то краткое имя таблицы какпсевдоним

0 голосов
/ 12 марта 2012

Если бы я использовал SQL Server, я бы, вероятно, поместил производную таблицу в Общее табличное выражение (CTE) с логическим именем (чтобы указать, что это за таблица), а затем сократил бы ее до имени корреляции.(«псевдоним таблицы») в основном запросе (для удобства чтения), например,

WITH StockTransactions__type_S_or_B__smallest_units
     AS
     (
      <derived table query here>
     )
SELECT stkTrans.StockName
       ...
FROM tblStockTransactions AS stkTrans 
INNER JOIN StockTransactions__type_S_or_B__smallest_units AS stkTrans1 
   ON (stkTrans.BookCode = stkTrans1.BookCode) AND (stkTrans.Sedol = stkTrans1.Sedol)
GROUP BY stkTrans.BookCode, stkTrans.StockName, stkTrans.Sedol;

Очевидно, что это не вариант в Access, поэтому вы переходите прямо к имени корреляции и полностью теряете полное имя.Это не идеально, но приемлемо, IMO.


SQL требует присвоения имени производной таблице без всякой причины.Этот пример из Хью Darwen , из которого я думаю, мы можем с уверенностью предположить, что обязательство раздражает его:

SELECT DISTINCT E#, TOTAL_PAY 
FROM ( SELECT E#, SALARY + BONUS AS TOTAL_PAY
FROM EMP ) AS TEETH_GNASHER
WHERE TOTAL_PAY >= 500

Лично для такого бессмысленного требования я выбираю почти бессмысленное и непротиворечивое имяDT1 - сокращение первой производной таблицы с учетом DT2, DT3 и т. Д., Например:

SELECT DISTINCT E#, TOTAL_PAY 
FROM ( SELECT E#, SALARY + BONUS AS TOTAL_PAY
FROM EMP ) AS DT1
WHERE TOTAL_PAY >= 500
...