如何在多租户应用程序的业务层中为可扩展的数据库结构设计实体?

Posted

技术标签:

【中文标题】如何在多租户应用程序的业务层中为可扩展的数据库结构设计实体?【英文标题】:How do I design entities in business layer of a multi-tenant application for an extendable database structure? 【发布时间】:2014-01-13 13:28:07 【问题描述】:

例如,我希望一个产品可能有来自不同租户的多个版本,一个版本产品有 3 个字段,另一个有 6 个字段。那么我将如何在业务层中表示这个实体,以将我的业务逻辑应用到我的应用程序而不是数据库中。 如何在没有静态类的情况下动态了解实体的语义。

我知道如何设计数据库。我询问了业务层的设计。我有针对不同租户的业务逻辑,这些租户对一个实体或许多实体有不同的要求。当我没有要添加方法的特定实体时如何处理?我没有具有静态属性的产品。我将如何在仅存储在数据库中的抽象数据库列上添加许多不同的折扣公式。 如何将不同版本的实体从数据库传递到业务层进行处理,然后再传递到 Web 客户端进行显示和编辑。 如何在 Web 客户端和数据库之间表示它,将在其中处理它,业务层!

【问题讨论】:

【参考方案1】:

如何在没有静态的情况下动态了解实体的语义 类。

这是您的代码的责任。如果您的 product 依赖于租户,那么您唯一需要做的就是即时检查您的租户并选择正确的逻辑。

我知道如何设计数据库。我询问了业务层的设计。我有不同租户的业务逻辑,这些租户对一个实体或其中许多实体有不同的要求。当我没有特定实体来添加方法时如何处理

我会使用租户相关的strategies 来解决它。

Strategy (GoF patterns): 该模式定义了一系列算法,封装了每一个算法,并使它们在运行时可互换。当您有一些逻辑并且您希望它独立于使用它的客户而变化时使用此模式,同时仍然具有可扩展的模型。

解决下一个问题,

如何将不同版本的实体从数据库传送到业务层进行处理,然后传送到Web客户端进行显示和编辑。

我认为,您可以使用继承或将产品属性公开为单个通用属性集合。

无论如何,您都是了解您的项目并且可以选择更好解决方案的人。没有灵丹妙药。

【讨论】:

嗯。您的回答令人满意,但我一直在寻找有经验或更多经验的人,并提供示例或一些中肯的资源。我已经搜索了一个星期,但没有很好的资源来解释一些标准,明确抽象概念并用 C# 等语言解释实现。当你说我现在将实施策略时,我从资源中很清楚,如果你能解释一下当我没有静态产品类时如何知道语义,我会很高兴,它以形式存在于数据库中名称-值对。 您现在如何存储您的产品?你能给我一个现在存储的产品实体的例子吗? 此图显示了名称-值方法,其中每个租户可以根据需要创建任意数量的自定义字段以满足其业务需求。图片:i.msdn.microsoft.com/dynimg/IC95834.gif 我也在遵循这种方法,我必须创建一个处理数据库工作的层,但我正在设计和搜索如何在业务层中表示这些实体,我还阅读了 C# 和 expendoobject 中的动态类型。你说什么?

以上是关于如何在多租户应用程序的业务层中为可扩展的数据库结构设计实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在多租户应用程序中更新所有租户的所有架构?

在多租户应用程序中如何检查应用程序在 Azure 门户中注册的租户数据?

如何在多租户环境中自动选择配置的 SAML 身份提供程序以使用 Spring SAML 进行 SSO

在多租户应用程序中动态设置 Flask-SQLAlchemy 数据库连接

在多租户环境中,如何在运行时在不同的 url(子域)上为不同的服务提供者提供不同的元数据?

我们如何在 Spring cloud dataflow kafka binder 中为 Kafka 维护租户数据隔离?