Создание несуществующих таблиц базы данных в коде - PullRequest
3 голосов
/ 06 июля 2010

До этого момента моя компания не обращала внимания на базы данных и старалась хранить все данные в файлах, разделенных запятыми. Я столкнулся с уникальным клиентским приложением, которое - я считаю - выиграло бы от использования реляционной базы данных. Приложение требует хранения «сводных» данных, касающихся производственного процесса, и «подробных» данных по нескольким подпроцессам. Подпроцессы должны быть связаны с кратким описанием процесса.

Мой вопрос: это нормально / уместно проверить существование таблицы перед записью в эту таблицу и создать ее, если таблица не существует? Это может привести к большему вопросу теперь, когда я набираю это; если база данных не существует, мне следует создавать базу данных и любые таблицы, которые ей требуются?

Ответы [ 9 ]

3 голосов
/ 06 июля 2010

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

Например, Firefox в наши дни использует SQLite для внутреннего хранения, и они никогда не мешают пользователю создавать базы данных.И пользователям это нравится.:)

Но я бы не стал слишком беспокоиться о создании базы данных непосредственно перед ссылками на таблицы: вместо этого я бы поместил логику создания во время запуска приложения или во время установки, в зависимости от того, что более уместно.Где сейчас в вашем приложении созданы файлы CSV?Созданы ли они заново, каждый раз, когда на них ссылаются?Или они тоже созданы в процедурах инициализации или установки?

3 голосов
/ 06 июля 2010

Нет, создавать таблицы в коде ненормально.Если вам нужна реляционная база данных, вам нужно спроектировать ее перед использованием.Реляционные базы данных не должны шутить.

Если вы никогда не делали этого раньше, вот введение в предмет ... http://www.databasedev.co.uk/design_basics.html

(Извините, если вы все это знаете; Я не хочу покровительствовать.)

2 голосов
/ 06 июля 2010

Обычно я бы сказал, что отсутствие таблицы подразумевает проблему где-то.Динамически создаваемые таблицы обычно являются признаком того, что что-то идет не так, и если они являются стандартными таблицами (например, tblUsers), то они всегда должны существовать, будучи настроенными как часть процесса установки.Проверка на существование имеет смысл, если вы получили определенное расстояние в разработке кода и обновили свою базу данных, добавив дополнительные таблицы, но хотите, чтобы ваш код работал с этим новым и старым дизайном.В этом случае имеет смысл проверить наличие таблиц, прежде чем пытаться их использовать.

В общем, хотя вы должны знать, какие таблицы находятся в вашей базе данных, и поэтому не нужно проверять их наличие.И я совершенно не понимаю, почему вы пытаетесь получить доступ к базам данных, которые не существуют ... Вы думаете о ленивом процессе установки, когда новые клиенты (или подобные) могут быть добавлены на лету, а ихбазы данных созданы?Если это так, у меня будет один процесс для создания и настройки этих новых баз данных.

1 голос
/ 06 июля 2010

Вы должны знать структуру своих данных перед написанием приложения.

Храните данные и приложение по возможности отдельно.

Использование уровня доступа к данным также означает, что если у вас уже естьПриложение Windows (например), а затем хотите создать веб-интерфейс, вы можете легко повторно использовать DAL.

Если доступ к данным встроен в приложение, гораздо сложнее повторно использовать этот код.

1 голос
/ 06 июля 2010

Sqlite имеет синтаксис «создать таблицу, если не существует» именно для этого типа контекста.(отметьте http://www.sqlite.org/lang_createtable.html) Большинство библиотек также имеют возможность создать новый файл базы данных sqlite при подключении, если он еще не существует.

1 голос
/ 06 июля 2010

SubSonic SimpleRepository обычно очень хорошо справляется с ситуацией такого типа (за исключением отношений с внешним ключом).

Обычно я бы не хотел создавать и поддерживать базу данных и / или таблицы с помощью кодакак это может взорваться в вашем лице.

0 голосов
/ 07 июля 2010

Многие РСУБД поддерживают операторы DDL SQL. ADOX можно использовать с некоторыми базами данных, например, для создания новых таблиц. Я не думаю, что это особенно экзотично, особенно когда программа использует какую-то «встроенную» файловую базу данных как внутреннее хранилище данных или даже как выходной формат.

Нет проблем при создании индексов, ограничений, отношений и т. Д. По мере необходимости. Пример:

Private Const WG_CONNSTRING As String = _
      "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;" _
    & "Jet OLEDB:Create System Database=True;" _
    & "Data Source='$MDB$.mdw'"
Private Const DB_CONNSTRING As String = _
      "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Engine Type=5;" _
    & "Jet OLEDB:System Database='$MDB$.mdw';" _
    & "Data Source='$MDB$.mdb'"

'Exits with new MDB created, populated from initial data
'in text files, and cnDB left open.

Dim catDB As Object 'Don't early-bind ADOX objects.

Set catDB = CreateObject("ADOX.Catalog")
catDB.Create Replace$(WG_CONNSTRING, "$MDB$", MDB_NAME)
catDB.Create Replace$(DB_CONNSTRING, "$MDB$", MDB_NAME)

Set cnDB = catDB.ActiveConnection
With cnDB
    .Execute "CREATE TABLE Fruits (" _
           & "FruitID IDENTITY NOT NULL CONSTRAINT PK_FruitID PRIMARY KEY," _
           & "Fruit TEXT(50) WITH COMPRESSION NOT NULL UNIQUE" _
           & ")", _
             , adCmdText
    .Execute "CREATE TABLE Pies (" _
           & "PieID IDENTITY NOT NULL CONSTRAINT PK_PieID PRIMARY KEY," _
           & "Pie TEXT(50) WITH COMPRESSION NOT NULL," _
           & "FruitID INTEGER NOT NULL CONSTRAINT FK_FruitID " _
           & "REFERENCES Fruits (FruitID)" _
           & ")", _
             , adCmdText
    .Execute "CREATE VIEW PiesView (ID, Pie, Fruit) AS " _
           & "SELECT PieID AS ID, Pie, Fruit " _
           & "FROM Pies LEFT OUTER JOIN Fruits " _
           & "ON Pies.FruitID = Fruits.FruitID", _
             , adCmdText
    .Execute "CREATE PROC InsertPie(NewPie TEXT(50), FruitName TEXT(50)) AS " _
           & "INSERT INTO Pies (Pie, FruitId) " _
           & "SELECT NewPie, Fruits.FruitId FROM Fruits " _
           & "WHERE Fruit = FruitName", _
             , adCmdText
End With
0 голосов
/ 06 июля 2010

Ответ зависит от характера вашего проекта.

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

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

0 голосов
/ 06 июля 2010

Реляционные базы данных позволяют легко обмениваться данными.

Вы можете использовать файлы, когда вам не нужно обмениваться данными.

Сериализация DataSet - хороший вариант для хранения информации о файлах. Вы поддерживаете данные, структурированные как реляционные базы данных.

Сериализация XML медленная, но вы можете использовать BinaryFormatter с:

RemotingFormat = SerializationFormat.Binary

Эта опция делает быструю и компактную двоичную сериализацию.

Code-Project включает статью «Быстрая сериализация». Но это не стандарт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...