Столбец динамической таблицы - PullRequest
0 голосов
/ 01 июня 2010

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

Пример, пользователь создал таблицу с именем XYZ и определил столбец X1, X2, X3 и т. д. И таблица транзакций как Tran_XYZ, и она содержит ссылку на XYZ, а также столбец X1, X2, X3, значения которого здесь переопределяются.

Мне нужно внедрить этот динамический столбец в asp.net, пожалуйста, предложите мне лучшую технологию и метод для подражания.

1 Ответ

1 голос
/ 01 июня 2010

Хм, я не уверен, что у меня есть отличный ответ для вас относительно того, что вы должны делать, но я бы не рекомендовал вашему приложению использовать DDL для динамического создания реальных таблиц в вашей базе данных.Не сказать, что это никогда не должно быть сделано, но я бы сказал, что 99% времени это, вероятно, не очень хорошая идея.

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

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

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

EDIT: исправлено мое форматирование.

-- this table identifies the user-defined master tables
create table UserDefinedMasterType (
  MasterTypeID int not null,
  MasterTypeName varchar(50) not null

  -- primary key on MasterTypeID
)

-- this table stores the data for each user-defined master table
-- each record is uniquely identified by the MasterTypeID and MasterDataID
create table UserDefinedMasterData (
  MasterTypeID int not null,
  MasterDataID int not null,
  Data xml not null

  -- primary key on MasterTypeID and MasterDataID
  -- foreign key on MasterTypeID to UserDefinedMasterType.MasterTypeID
)

- this is the core transactional table that does not contain any references to user-defined master data
create table TransactionalData (
  TransactionID int not null primary key,
  -- other transactional columns,
)

-- this is a table related to the core transactional table that also contains references to the user-defined master table
create table TransactionalUserDefinedData (
  TransactionID int not null,
  MasterTypeID int not null,
  MasterDataID int not null,  
  Data xml,

  -- primary key on TransactionID and MasterTypeID
  -- foreign key on TransactionID to TransactionalData.TransactionID
  -- foreign key on MasterTypeID and MasterDataID to UserDefinedMasterData.MasterTypeID and UserDefinedMasterData.MasterDataID
)

Таким образом, таблица TransactionalUserDefinedData находится в отношении 1-ко-многим стаблица TransactionalData, которая является основной таблицей транзакций.TransactionalUserDefinedData связывает запись транзакции с 0, 1 или более определяемыми пользователем основными таблицами.Столбец XML в таблице UserDefinedMasterData и в таблицах TransactionalUserDefinedData позволяет динамически указывать «столбцы» данных.

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

Если вы не хотите, чтобы запись транзакции была связана с несколькими определяемыми пользователем основными таблицамикак в моем примере, вы можете либо изменить первичный ключ в таблице TransactionalUserDefinedData, чтобы он был только столбцом TransactionID, который изменяет отношение этой таблицы к столбцу TransactionalData с 1-ко-многим на 1-к-1, или просто переместитьстолбцы из таблицы TransactionalUserDefinedData в таблицу TransactionalData.

...