Проектирование баз данных для агностических базой данных приложений

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
16
задан tshepang 19 September 2012 в 22:28
поделиться

17 ответов

Короткий ответ должен придерживаться функций, которые являются стандартно, или близко к стандартно реализованному. Что это означает, более подробно:

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

  • последовательности Отдельных автоинкрементных полей от самих полей. Это будет выглядеть немного вызванным для MSSQL, но реализует чисто в Oracle, DB/2 и т.д., не нуждаясь ни в какой эмуляции фиксирует.

  • Сохраняют символ и varchar поля ниже самого маленького максимального размера для набора механизмов, к которым Вы стремитесь.

  • , Когда Вы пишете, запросы используют полный синтаксис СОЕДИНЕНИЯ и заключают в скобки СОЕДИНЕНИЯ так, чтобы каждое соединение было между единственной таблицей и выражением в скобках.

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

Кроме того включенное усилие не должно быть слишком пугающим, таким образом, это может стоить того.

15
ответ дан 30 November 2019 в 16:10
поделиться

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

Для крупных клиентов (большие приложения) они должны полностью зависеть к базе данных. Поскольку мало настраивает, действительно проблема, чтобы иметь XE Oracle и MySQL на одном сервере (или два).

Действительно, я предпочитаю использовать больше чем одну базу данных и что приложение знает, который база данных - то, что "abastract" кодирует.

0
ответ дан 30 November 2019 в 16:10
поделиться

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

0
ответ дан 30 November 2019 в 16:10
поделиться

Правило 1: не используйте базу данных определенные функции

Правило 2: не используйте хранимые процедуры.

Правило 3: Если Вы повреждаете Правило 1, то повреждаете правило 2 также.

было много комментариев о не использовании хранимых процедур. Это вызвано тем, что синтаксис/семантика очень отличается и так портирует их, является трудным. Вы не хотите "кучу" кода, что у Вас есть перезапись и перетест.

, Если Вы решаете, что действительно необходимо использовать базу данных определенные функции тогда, необходимо скрыть те детали позади хранимой процедуры. Вызов хранимых процедур другой базы данных все довольно подобен. В процедуре, которая записана в МН / SQL, можно использовать любые конструкции Oracle, которые Вы находите полезными. Тогда необходимо записать эквивалент для других целевых баз данных. Таким образом, части, которые являются конкретной базой данных, находятся в той базе данных только.

0
ответ дан 30 November 2019 в 16:10
поделиться

А также принимая во внимание много хороших и разумных ответов здесь, я также добавил бы, что что-то как миграции ActiveRecord (от Ruby on Rails, но можно просто пользоваться библиотекой) могло бы быть полезным. Это абстрагирует материал как таблица соответствующие типы столбца creation/alteration, более простое индексное управление и (к определенной сумме) упорядочивающий на довольно простой описательный язык.

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

Из любопытства я переключился между Oracle, SQL MS, MySQL и SQLite с тем же набором миграций и худшей проблемы, которую я имел, обнаруживал, что я должен был гарантировать свои имена столбцов, и имена таблиц не были в объединении списков зарезервированного слова через DBS.

0
ответ дан 30 November 2019 в 16:10
поделиться

Я понимаю другие ответы здесь, но почему бы не использовать хранимые процедуры? Это так, чтобы логика не была скрыта?

0
ответ дан 30 November 2019 в 16:10
поделиться

Исследование впереди наименьший общий знаменатель для типов данных. Например, SQL Server имеет целое число, но Oracle использует число.

0
ответ дан 30 November 2019 в 16:10
поделиться
  1. не используют хранимые процедуры
  2. , не используют поставщика определенный SQL

Или, используют технологию персистентности те, которые в спящем режиме / nHibernate что краткие обзоры далеко различия между другим DBS.

0
ответ дан 30 November 2019 в 16:10
поделиться

95%-е портативное устройство почти так же хорошо как портативное, если можно изолировать зависимый от платформы код на определенный слой. Так же, как Java был описан как 'Запись однажды тест везде' , все еще нужно протестировать приложение на каждой платформе, Вы намереваетесь работать на нем.

, Если Вы осмотрительны со своей платформой определенный код, можно использовать портативный код для 95 + % функциональности, которая может быть сделана соответственно портативным способом. Остающиеся части, которые должны быть сделаны в хранимой процедуре или другой зависимой от платформы конструкции, могут быть встроены в серию зависимых модулей платформы к стандартному интерфейсу. В зависимости от платформы Вы используете модуль, соответствующий той платформе.

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

1
ответ дан 30 November 2019 в 16:10
поделиться

Сохраните имена полей и имена таблиц короткими (< 30 символов) и нечувствительный к регистру. например, TABLE_NAME и FIELD_NAME

2
ответ дан 30 November 2019 в 16:10
поделиться

В 2001 я работал над продуктом, который должен был поддерживать Oracle 8, SQL Server 2000 MS и Струю MS 3.51 (иначе Access97). В теории мы, возможно, наняли специалистов для каждого из этих продуктов и процесса тестирования, который гарантировал, что все привели к тем же результатам. На практике была тенденция к наименьшему общему знаменателю.

Один подход должен был создать связанные таблицы в Доступе/Струе для Oracle Server, и SQL Server тогда исключительно пишут Струйный SQL. Проблема здесь состоит в том, что Струйный синтаксис SQL очень ограничен.

Другой подход (обычно используемый даже в системах, которые только когда-либо использовали один продукт DBMS!) должен попытаться сделать больше работы, что каждый действительно должен во фронтэнде, вещи, которые должны быть доменом DBMS. Проблема здесь - это, часто имеет катастрофические последствия в отношении целостности данных. Я уверен, что Вы знаете ситуацию: приложение должно рефрен от записи недопустимых данных, но без ограничений в самом DBMS это является широко открытым для ошибок приложения. И затем существует пользователь, кто знает, как соединиться с данными через Excel, Studio управления SQL, и т.д., и таким образом полностью обход приложения, которое, как предполагается, гарантирует целостность данных...

Лично, я писал все больше код на скользящей шкале того, что я только позже обнаружил, был назван 'мобильностью'. Идеально, прежде всего 'ванильный' код, понятый под всем DBMSs, который мы поддерживали, и при этом я обнаружил SQL-89 и SQL 92 Стандарта. Затем был код SQL, который мог легко быть переведен (возможно, использование кода) для каждого DBMS, например, Oracle использовала тот неприятный вставленный синтаксис внешнего объединения, но понятие внешнего объединения было там; Oracle Server и SQL Server использовали ПОДСТРОКУ, но Струя потребовала, чтобы ключевое слово было MID$; и т.д. Наконец, существуют вещи, которые просто должны быть конкретной реализацией, очевидно, избегаемой если вообще возможный при тихом обращении должного внимания на целостность данных, функциональность и производительность.

Счастливо, в прошедшие годы продукты придвигались поближе к Стандартам ANSI SQL (кроме Струи, которая удерживалась от использования MS, теперь только поддерживается командой Доступа MS по-видимому путем вырезания основных функций, таких как безопасность и репликация). Таким образом, я сохранил привычку к записи Стандартного SQL, если это возможно.

4
ответ дан 30 November 2019 в 16:10
поделиться

Люди ответа будут часто говорить Вам, не должен использовать базу данных определенный sql и просто кодировать к ansi стандартам. Они будут часто говорить, только говорят с базой данных через сохраненный procs к краткому обзору любой sql. Они - неправильные ответы и только приводят к боли. При кодировании к 'стандарту' sql в значительной степени невозможен, потому что у каждого поставщика есть такие различные интерпретации.

то, К чему Вы должны, имеют некоторый слой персистентности базы данных краткие обзоры различия между базами данных (извините johnstock, это почти точно, что Вы сказали). Существует много других ORMs и аналогичные продукты, чтобы сделать это для каждой платформы,

4
ответ дан 30 November 2019 в 16:10
поделиться

Я иду в ответ plagerize johnstok 1) Не используют хранимые процедуры и 2) Не используют поставщика определенный SQL и добавляют к нему.

Вы также спросили, "Это даже стоит усилия?". Я сказал бы..., возможно. Я записал средство отслеживания ошибки с открытым исходным кодом, BugTracker.NET, который основан на SQL Server. Существует много developrs, кто просто не дал бы ему попытку, потому что им нравится придерживаться технологий, которыми они довольны. И, когда я рассматривал запуск услуги хостинга, я заметил, что выделенные виртуальные серверы Linux являются намного более дешевыми, чем Windows (невиртуальные) сервисы. Я мог теоретически выполнить C# под моно, но мой SQL так определен для SQL Server (даже при том, что я не использую сохраненный procs), это было бы огромное усилие портировать.

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

Так, возможно, будучи открытым действительно имеет значение, Вам. Какое приложение - это? Кто будет использовать его?

Вы также спросили, "Каков ptifalls". Не тестирование, как Вы продвигаетесь. Если Вы планируете поддерживать 4 dbs, Вы перечислили, то необходимо тестировать с ними рано и часто а не просто предназначаться для того при размышлении, что будет легко преобразовать в другие. К тому времени Вы могли бы оказаться в архитектурном тупике.

4
ответ дан 30 November 2019 в 16:10
поделиться

На вашем месте я был бы думать трудно о доходе от Ваших инвестиций здесь .

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

могло бы оказаться, что можно покрыть 95% потенциальных клиентов путем поддержки просто Oracle & SQL Server (или MySQL & SQL Server, или... и т.д.).

Проводят Ваше исследование прежде идущий дальше , и удачи!

6
ответ дан 30 November 2019 в 16:10
поделиться

В дополнении к этому ответу, и как правило, не позволяют серверу генерировать или вычисляют данные. Всегда отправляйте прямые указания SQL, исключая формулы. Не используйте свойства значения по умолчанию (или делайте их основными, не формулы). Не используйте правила проверки, Оба значения по умолчанию и правила проверки должны быть реализованы на стороне клиента.

1
ответ дан 30 November 2019 в 16:10
поделиться

Я в настоящее время поддерживаю Oracle, MySQL и SQLite. И быть честным это жестко. Некоторые рекомендации были бы:

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

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

6
ответ дан 30 November 2019 в 16:10
поделиться

IMO это зависит от типа разрабатываемого вами приложения:

0
ответ дан 30 November 2019 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: