database - 将两个完全不同的类作为一个类

标签 database oop inheritance design-patterns

我有一个关于设计模式的非常愚蠢的问题:假设我们有两个类 PostProduct,对于它们中的每一个,我们在数据库中都有不同的表,并且它们彼此没有任何共同点,所以我们不能为它们创建基类。一些帖子甚至包含产品。以下是我们应该如何处理它们:

  1. 以某种方式将 PostProduct 实例存储在数据库中,当用户从下一个项目请求新闻提要时,将它们打包在一个数组中(如果重要,使用 C++),发送给客户端,客户端接收解包(使用Java)。
  2. 接下来,我们必须在一个列表中同时显示PostProduct(例如Facebook 上的新闻提要)。<
  3. 此外,我们可以通过聊天与 friend 分享PostProduct。所以我们可以发送 PostProduct 作为消息的附件(因此,我们应该存储发送的 PostProduct 的 id 在服务器端数据库中 messages 表的 attached_item 列中。

那么,哪种设计模式在这里最好?我应该如何实现 PostProduct 类?

最佳答案

这是一个非常宽泛的问题,但这里是您可以提供的框架,只是为了给您一些想法:

// An interface containing methods specific to objects you can list
interface Listable {}

// An interface containing methods specific to objects you can share
interface Shareable {}

// An interface containing methods specific to objects you can send
interface Sendable {}

class Post implements Listable, Shareable, Sendable {
    List<Product> products;
}

class Product implements Listable, Shareable, Sendable {
}


class ListManager {
    public void addToList(Listable element) { }
}

class ShareManager {
    public void share(Shareable element) { }
}

class SendManager {
    public void send(Sendable element) { }
}

然后您可以这样交替使用 PostProduct:

Post post = new Post();
Product product = new Product();

ListManager listManager = new ListManager();
listManager.addToList(post);
listManager.addToList(product);

ShareManager shareManager = new ShareManager();
shareManager.share(post);
shareManager.share(product);

SendManager sendManager = new SendManager();
sendManager.send(post);
sendManager.send(product);

关于数据库表示,正如 fusiled 在他的评论中所建议的,只需将它们放在 2 个单独的表中。在两者之间使用映射表将产品链接到他们的帖子。

编辑 关于 MESSAGES 表的问题

您可以添加一个新的映射表 MESSAGE_ATTACHED_ITEM,其中包含列 messageIdpostIdproductId。仅在将项目附加到消息时为相关列设置值

或者另一种选择是拥有一个仅包含 ID 的 ATTACHED_ITEM 表。 并让 Post 和 Product 表具有指向该表 ID 的外键。 然后您可以将此 attachedItemId 粘贴到您的 attached_item 列中

关于database - 将两个完全不同的类作为一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49809873/

相关文章:

mysql - 从另一个表更新列 - mySQL 3.5.2

php - 下面的代码如何确保每个浏览器只创建一个与数据库的连接?

javascript - 使用 `this` 的 JS 对象给出了未定义的结果

wpf - 获取要传播的附加属性继承

C# 覆盖 Collection<T> 中的方法

Objective-C 继承和类型转换

database - 寻找基于网络的日志收集/显示应用程序

php - 选择并取消链接 3 个表上的文件

c++ - 简单的 char* 内存分配不起作用

html - 从数据库接收的文本不会溢出到新行