Дизайн таблицы в SQL Server

#sql-server #database-design

#sql-сервер #база данных-дизайн

Вопрос:

У меня есть требование, которое требует дизайна таблицы, где необходимо поддерживать файлы, загруженные для любых приложений. Есть ли простой способ добиться этого без какого-либо триггера / Sproc?

 ID        AppName FileName    fileorder 
1          abc    file1        1
2          abc    file2        2
3          abc    file1        3
4          xyz    test1        1    - start a fresh 
5          xyz    test2        2
6          abc    file3        4    - resume from previous value of 'abc' 
7          xyz    test3        3    - resume from previous value of 'xyz'
8          grt    file1        1    - start a fresh
  

Ответ №1:

Нет, вы ничего не можете написать в CREATE TABLE, которая автоматически заполнит fileorder столбец таким образом. Единственный способ, которым вы можете это сделать, — это использовать некоторое пользовательское кодирование.

Я не знаю, по какой причине вы хотите создать подобный столбец в своей таблице, но по большинству причин, которые я могу придумать, вам, вероятно, лучше вообще не сохранять это значение в своей таблице и либо вычислять его во время запроса, либо создавать ПРЕДСТАВЛЕНИЕ, включающее вычисление этого столбца.

Комментарии:

1. Спасибо за ответ. Основная причина этого требования заключается в том, что, когда мы загружаем файлы в SFTP, мы не хотим, чтобы там были дубликаты файлов, поскольку это приведет к замене. Я знаю, что мы можем добавить временную метку при их загрузке, но мы пытаемся получить какой-то номер заказа, который они загрузили. Изначально мы думали сделать это на самом Java layer, однако у нас есть два параллельных пути для генерации одинаковых имен файлов, и поэтому мы думаем о сохранении в базе данных согласованности. Абстракция представления может сработать для нас. Проверим это. Еще раз спасибо

2. Да, если это для создания файлов, то вам лучше добавить этот столбец в ПРЕДСТАВЛЕНИЕ, вместо того, чтобы пытаться сохранить его в таблице.

Ответ №2:

Вместо записи значения fileorder в таблицу вам было бы лучше написать запрос для чтения таблицы, которая выглядит следующим образом:

 SELECT ID, AppName, FileName, ROW_NUMBER() OVER(PARTITION BY AppName ORDER BY ID) AS fileorder
FROM YOUR_TABLE                      -- Whatever your table name is
WHERE AppName in ('abc','xyz','grt') -- Any relevant WHERE clause
ORDER BY ID;
  

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

Комментарии:

1. Как упоминал Таб Аллеман, вы могли бы использовать этот запрос выше, чтобы заполнить определение представления, которое дало бы вам нужные результаты.

2. Спасибо, Чад, за быстрый ответ. Я думал о вычисляемом столбце, но опять же, это не сильно поможет, как вы предложили. Возможно, я могу использовать View