Хм, я не уверен, что у меня есть отличный ответ для вас относительно того, что вы должны делать, но я бы не рекомендовал вашему приложению использовать 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.