此方案的数据库体系结构

时间:2011-04-11 06:05:38

标签: architecture database-design

嗯,这个建筑问题已经在我的脑海里徘徊了一段时间。假设以下情况:
我有一个Licenses表。从概念上讲,每个许可证都可以限制为(许可证类型):

  • 类型1:尝试次数。 (例如允许跑7次)
  • 类型2:试用(限时)。
  • 类型3:完整
  • ...

因此,每个许可证都应存储一些自定义值。 (类型1:整数,类型2:日期时间,类型3:null)

这种情况的最佳架构是什么?

  • 如果我决定将所有许可证放在一个表中,每行至少有一个未使用的列(对于类型1,EndDate为空,对于EndDate,TryTimes将为null,对于类型3,两者都为null):
    LicenseID---LicenseType---CustomerID---EndDate---TryTimes
    另一方面,我希望我的设计尽可能灵活(将来可能有更多的许可类型?)
  • 另一种可能的解决方案是使用类似元数据的方法:
    LicenseID---LicenseDefinition---CustomerID---
    LicenseDefinition包含有关许可证类型和限制的信息,并在代码端进行解析。

你建议哪一个更传统?你有没有其他方法可以实现它?

更新 刚刚发现的Sparse列是SQL Server。听起来很有希望......

3 个答案:

答案 0 :(得分:1)

您应为每种许可类型保留一个单独的表:

LicenseID(PK)---Type

LicenseID(FK)---EndDate

LicenseID(FK)---TryTimes

并且还保持数据完整性,例如只有计时许可证会进入第二个表格。

这也是一个非常可扩展的模型,您需要再添加一个表,一个完整性规则和一个以上的接口,以便添加另一个许可证类型。

答案 1 :(得分:1)

离我头顶(我还没有实现过这样的东西),我可能会做这样的事情:

CustomerLicense创建数据库表。在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驱动的:))

修改 忘了提 - 这种方法的力量是可扩展性。每当您想要添加新的许可证类型时,您只需向License表添加一个新行,并使用任何业务规则添加新的ILicense实现。

答案 2 :(得分:0)

您可以将一个表作为父表,另外三个表引用扩展架构的基表。

这是第一个选择。

另一种选择是使用简单的 NoSql 数据库占用空间小或 OO数据库(如db4o)甚至是简单的数据存储,例如加密XML文件