Architecture 此场景的数据库体系结构

Architecture 此场景的数据库体系结构,architecture,database-design,Architecture,Database Design,嗯,这个建筑问题在我脑海中徘徊了一段时间。假设以下场景: 我有一个许可证表。从概念上讲,每个许可证可以限制为(许可证类型): 类型1:尝试次数。(例如,允许运行7次) 类型2:试验(有时间限制) 类型3:完整 因此,每个许可证都应该存储一些自定义值。(类型1:Integer,类型2:DateTime,类型3:null) 这种情况下最好的架构是什么 如果我决定将所有许可证放在一个表中,则每行至少有一个未使用的列(类型1的EndDate为null,类型3的TryTimes为null): Li

嗯,这个建筑问题在我脑海中徘徊了一段时间。假设以下场景:
我有一个
许可证
表。从概念上讲,每个许可证可以限制为(许可证类型):

  • 类型1:尝试次数。(例如,允许运行7次)
  • 类型2:试验(有时间限制)
  • 类型3:完整
因此,每个许可证都应该存储一些自定义值。(类型1:Integer,类型2:DateTime,类型3:null)

这种情况下最好的架构是什么

  • 如果我决定将所有许可证放在一个表中,则每行至少有一个未使用的列(类型1的EndDate为null,类型3的TryTimes为null):
    LicenseID---LicenseType---CustomerID---EndDate---TryTimes

    另一方面,我希望我的设计尽可能灵活(将来可能会有更多的许可证类型?)
  • 另一种可能的解决方案是使用类似元数据的方法:
    LicenseID---LicenseDefinition---CustomerID---

    其中LicenseDefinition包含有关许可证类型和限制的信息,并在代码端进行解析
你建议哪一个更传统?你有没有其他的建议来实现它

更新:
刚刚了解到的
Sparse
列是SQL Server。听起来很有希望…

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

LicenseID(PK)---Type

LicenseID(FK)---EndDate

LicenseID(FK)---TryTimes
并且还保持数据完整性,例如只有时间试用许可证才会进入第二个表格


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

您可以将一个表作为父表,并有三个其他表引用扩展架构的基表

这是第一个选择

另一种选择是使用占用空间小的简单的NoSql数据库,或者像db4o这样的OO数据库,甚至是像加密的
XML
文件这样的简单数据存储(我还没有实现类似的功能),我可能会这样做:

public function isLicenseValid($customer)
{
    return LicenseFactory::getLicense($customer->licenseType)->isValid($customer);
}
客户
许可证
创建数据库表。在
客户
中,连同所有其他通用客户信息,我将为
许可证类型
添加一列,该列将
引用
许可证

License
将存储
licenseId
以及任何相关元数据这不包括特定于许可证的规则。

在代码方面,我将创建一个
LicenseFactory
类,该类将创建一个许可证接口的实例(
ILicense
ILicense
可能看起来像这样(在PHP中):

然后,我会有特定于许可证的实现:

class TrialLicense implements ILicense
{
    public isValid($customer)
    {
        // business logic for this specific license type here
    }
}
factory类将类似于:

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驱动的:)

编辑:
忘了提一下——这种方法的强大之处在于可扩展性。每当您想要添加一个新的许可证类型时,您只需向
许可证
表中添加一个新行,并使用所需的任何业务规则添加一个新的
ILicense
实现。

如何将数据存储在varchar字段中,并使用一个额外的列指定该类型。您需要在代码中进行一些转换,但这应该很好easy@Andrew:非常接近我的第二个解决方案。你为什么不把它作为答复寄出去?到目前为止我最喜欢的一个。说实话,我不知道为什么,但我认为这会限制扩展性。我只是觉得这不对。但我想我得多想想+我同意这个想法。非常有趣的黛米安。我能看到的唯一限制是客户不能有超过1个许可证。解决方案是创建一个CutomerLicense表,该表可以保存一对多关系(一个Cutomer到多个CutomerLicense)…当然,您还必须修改isLicenseValid函数来处理多个许可证(目前只处理一个)。