嗯,这个建筑问题已经在我的脑海里徘徊了一段时间。假设以下情况:
我有一个Licenses
表。从概念上讲,每个许可证都可以限制为(许可证类型):
因此,每个许可证都应存储一些自定义值。 (类型1:整数,类型2:日期时间,类型3:null)
这种情况的最佳架构是什么?
LicenseID---LicenseType---CustomerID---EndDate---TryTimes
LicenseID---LicenseDefinition---CustomerID---
你建议哪一个更传统?你有没有其他方法可以实现它?
更新
刚刚发现的Sparse
列是SQL Server。听起来很有希望......
答案 0 :(得分:1)
您应为每种许可类型保留一个单独的表:
LicenseID(PK)---Type
LicenseID(FK)---EndDate
LicenseID(FK)---TryTimes
并且还保持数据完整性,例如只有计时许可证会进入第二个表格。
这也是一个非常可扩展的模型,您需要再添加一个表,一个完整性规则和一个以上的接口,以便添加另一个许可证类型。
答案 1 :(得分:1)
离我头顶(我还没有实现过这样的东西),我可能会做这样的事情:
为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驱动的:))
修改强>
忘了提 - 这种方法的力量是可扩展性。每当您想要添加新的许可证类型时,您只需向License
表添加一个新行,并使用任何业务规则添加新的ILicense
实现。
答案 2 :(得分:0)
您可以将一个表作为父表,另外三个表引用扩展架构的基表。
这是第一个选择。
另一种选择是使用简单的 NoSql 数据库占用空间小或 OO数据库(如db4o)甚至是简单的数据存储,例如加密XML
文件