Я разрабатываю систему для записи и представления данных о ежедневных измерениях. Данные состоят из идентификатора категории, даты / времени и данных измерений (которых может быть до 500 штук как с плавающей точкой, так и с целым числом).
Категории отображаются в виде древовидной структуры, в которой данные связаны как с узлом, так и с листом.
Необработанные данные поступают в виде CSV в следующем формате:
1/6/2001 15:55, /Node1/Node2/Node3, 121, 34, 452, 651, 167
1/6/2001 15:55, /Node1/Node2/Node3/LeafA, 12, 34, 45, 65, 67
1/6/2001 15:55, /Node1/Node4/Node5/LeafB, 21, 32, 43, 54, 65
Я планирую использовать Список смежности (см. Структура базы данных для древовидной структуры данных ) для древовидной структуры. Я также планирую иметь вторую таблицу только для данных измерений и даты / времени. Таким образом, как только древовидная структура генерируется в первый раз, на нее можно снова и снова ссылаться из таблицы данных измерений. Кроме того, небольшая таблица смежных таблиц делает систему более удобочитаемой :). В приведенной ниже таблице категорий Name будет именем узла или листа (например, Node1 или LeafA), а FullName будет полным путем ветвления (например, Node1 / Node2 / Node3 / LeafA). Не уверен, что мне нужны оба, но я думаю, что они пригодятся, поэтому мне не нужно заново создавать FullName при необходимости.
CREATE TABLE [dbo].[Category](
[CatId] [int] IDENTITY(1,1) NOT NULL,
[ParentCatId] [int] NULL,
[Name] [nvarchar](30) NOT NULL,
[FullName] [nvarchar](MAX) NOT NULL
CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED
(
[CatId] ASC
) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[MeasurementData](
[CatId] [int] NOT NULL,
[DateCollected] [datetime] NOT NULL,
[foo] [int] NOT NULL,
[bar] [float] NOT NULL,
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[MeasurementData] WITH CHECK ADD CONSTRAINT [FK_ MeasurementData _Category] FOREIGN KEY([CatId])
REFERENCES [dbo].[Category] ([CatId])
GO
ALTER TABLE [dbo].[MeasurementData] CHECK CONSTRAINT [FK_ MeasurementData _Category]
GO
Чтобы загрузить данные в систему, я думал об использовании BCP для загрузки CSV в плоскую таблицу (в SQL Server 2008) и затем проецирования плоской таблицы в структуру иерархической таблицы.
Q1 : Должен ли я выполнить эту проекцию, используя T-SQL или C # (приложение C # вне SQL Server)?
Q2 : У кого-нибудь есть существующий алгоритм, позволяющий быстро найти (или создать и вернуть) правильный лист с указанным выше идентификатором категории?
К вашему сведению, я также нахожусь в процессе обдумывания синтаксиса рекурсивных запросов с использованием ключевого слова WITH, за которым следует общее табличное выражение - для случаев, когда мне нужно выполнить рекурсивное программирование.
https://stackoverflow.com/questions/tagged/common-table-expression
http://media.pragprog.com/titles/bksqla/trees.pdf
Заранее спасибо