Данные проекта из плоской таблицы в список смежности - PullRequest
0 голосов
/ 08 января 2011

Я разрабатываю систему для записи и представления данных о ежедневных измерениях. Данные состоят из идентификатора категории, даты / времени и данных измерений (которых может быть до 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

Заранее спасибо

1 Ответ

1 голос
/ 14 января 2011

Ваша структура таблицы может быть немного ненадежной.

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

TABLE: Category

HashId  NodeList
======  ===================
289383   node1\node2\....
139829   node6\node7\....

Внешний ключ из MeasurementData теперь находится в HashId.

Это отвечает вашему Q1: генерируйте хеш в C # при передаче данных, генерируя два выходных файла, которые готовы для BCP для таблиц Category и таблиц MeasurementData.

Поскольку это своего рода хранилище данных,не бойтесь создавать другие копии данных, которые оптимизированы для извлечения другими методами, поэтому непременно создайте второе представление категорий в таблице CategoryDetails примерно так:

TABLE CategoryDetails

HashId  NodeName  ParentNodeName
======  ========= =================
289383  node1
289383  node2     node1
etc, etc,

Что касается использования общих табличных выражений, у меня также были некоторые проблемы, когда я обдумывал их, но как только я понял это, я написал запись в блоге: http://database -programmer.blogspot.com / 2010/11 / recursive-queries-с-здравом table.html

...