Архитектура базы данных для этого сценария - PullRequest
0 голосов
/ 11 апреля 2011

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

  • Тип 1: Количество попыток.(например, разрешить запуск 7 раз)
  • Тип 2: Пробный (ограниченный по времени).
  • Тип 3: Полный
  • ...

Итак, каждая лицензия должна хранить какое-то пользовательское значение.(Тип 1: целое число, Тип 2: Дата и время, Тип 3: ноль)

Какая архитектура лучше всего подходит для этого сценария?

  • Если я решу поместить все лицензии в одну таблицу, у меня будет по крайней мере 1 неиспользованный столбец для каждой строки (EndDate будет нулевым для Типа 1, TryTimes будет нулевым для EndDate, и оба будутnull для типа 3):
    LicenseID---LicenseType---CustomerID---EndDate---TryTimes
    С другой стороны, я бы хотел, чтобы мой дизайн был максимально гибким (возможно, в будущем будет больше типов лицензий?)
  • Еще один возможный вариантрешение будет использовать некоторый подход, подобный метаданным:
    LicenseID---LicenseDefinition---CustomerID---
    Где LicenseDefinition содержит информацию о типе и пределе лицензии и анализируется на стороне кода.

Какой из них вы предлагаете быть более условным?Предлагаете ли вы другой способ его реализации?

ОБНОВЛЕНИЕ: Только что выяснилось, что Sparse столбцов - это SQL Server.Звучит очень многообещающе ...

Ответы [ 3 ]

1 голос
/ 11 апреля 2011

Вне моей головы (я еще ничего не реализовал), я мог бы сделать что-то вроде этого:

Создание таблиц базы данных для Customer и License. В пределах Customer наряду со всей другой общей информацией о клиенте я бы добавил столбец для licenseType, который будет reference таблицей License.

License будет хранить licenseId, а также любые соответствующие метаданные. Сюда не входят правила, относящиеся к лицензии.

На стороне кода я бы создал класс LicenseFactory, который бы создал экземпляр интерфейса лицензии (ILicense). ILicense может выглядеть примерно так (в PHP):

interface ILicense
{
    public isValid($customer);
}

Тогда у меня будут реализации для конкретной лицензии:

class TrialLicense implements ILicense
{
    public isValid($customer)
    {
        // business logic for this specific license type here
    }
}

Фабричный класс будет выглядеть примерно так:

class LicenseFactory
{
    public static function getInstance($type)
    {
        switch($type)
        {
            case 0:
                return new TrialLicense();
                break;
        }
    }
}

Итак, мой код приложения может выглядеть примерно так:

public function isLicenseValid($customer)
{
    return LicenseFactory::getLicense($customer->licenseType)->isValid($customer);
}

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

Edit: Забыл упомянуть - сила в этом подходе - расширяемость. Каждый раз, когда вы хотите добавить новый тип лицензии, вы просто добавляете новую строку в таблицу License и новую реализацию ILicense с любыми необходимыми бизнес-правилами.

1 голос
/ 11 апреля 2011

Вы должны вести отдельную таблицу для каждого типа лицензии:

LicenseID(PK)---Type

LicenseID(FK)---EndDate

LicenseID(FK)---TryTimes

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

Это также будет довольно масштабируемая модель, вам потребуется добавить еще одну таблицу, еще одно правило целостности и еще один интерфейс для добавления другого типа лицензии.

0 голосов
/ 11 апреля 2011

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

Это первый вариант.

Другой вариант - использование простого NoSql База данных с низкой занимаемой площадью или OO база данных , такая как db4o, или даже простые хранилища данных, такие как зашифрованный XML файл .

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