Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 将两个完全不同的类作为一个类使用_Database_Oop_Inheritance_Design Patterns - Fatal编程技术网

Database 将两个完全不同的类作为一个类使用

Database 将两个完全不同的类作为一个类使用,database,oop,inheritance,design-patterns,Database,Oop,Inheritance,Design Patterns,关于设计模式,我有一个非常愚蠢的问题:假设我们有两个类Post和Product,对于它们,我们在数据库中有不同的表,它们彼此没有任何共同点,所以我们不能为它们创建基类。一些帖子甚至包含产品。下面是我们应该如何处理它们: 不知如何存储DB中的代码>代码>产品>代码>实例,当用户请求下一个项目的新闻馈送时,将它们打包在一个数组中(如果使用C++,如果需要的话),将其发送到客户端,并在客户端(使用java)接收和解包。 接下来,我们必须在one列表中显示Post和Product(例如Facebook上

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

不知如何存储DB中的代码>代码>产品>代码>实例,当用户请求下一个项目的新闻馈送时,将它们打包在一个数组中(如果使用C++,如果需要的话),将其发送到客户端,并在客户端(使用java)接收和解包。
  • 接下来,我们必须在one列表中显示
    Post
    Product
    (例如Facebook上的新闻提要)
  • 此外,我们还可以通过聊天与朋友分享
    Post
    Product
    。因此,我们可以将
    Post
    Product
    作为消息的附件发送(因此,我们应该将发送的
    Post
    Product
    的id存储在服务器端数据库的
    messages
    表的
    附件项
    列中)

  • 那么,什么样的设计模式在这里是最好的呢?如何实现
    Post
    Product
    类?

    我认为解决方案可能比您想象的简单。为什么不使用一个通用的
    Java
    类接口并隐藏实现细节呢

    只需使用所需的方法实现一个公共接口。假设此公共接口被称为
    EntityInterface

    public class Post implements EntityInterface {};
    public class Product implements EntityInterface {};
    
    然后,当您想要处理这些类时,可以将它们视为
    EntityInterface
    对象:

    EntityInterface myNewPost = new Post();
    EntityInterface myNewProduct = new Product();
    //Now you see myNewProduct and myNewPost as EntityInterface objects
    

    这些代码片段在
    Java
    中,但在
    C++
    中使用虚拟函数,您也会得到相同的结果。

    这是一个非常广泛的问题,但这里是您可以使用的框架,只是给您一些想法:

    // 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) { }
    }
    
    关于数据库表示,正如他在评论中建议的
    fuseled
    ,只需将它们放在两个单独的表中即可。中间有一个映射表,用于将产品链接到其帖子

    编辑 关于MESSAGES表的问题

    您可以添加一个新的映射表MESSAGE\u ATTACHED\u项,其中包含列
    messageId
    postId
    productId
    。将项目附加到邮件时,仅将值设置为相关列

    或者,另一种选择是使用仅带有id的附加_ITEM表。 并使Post和Product表具有此表Id的外键。
    然后,您可以将此AttachedItem粘贴到您的attached_item列中

    嗯,它们有一些共同点,它们都可以在列表中,都可以共享,都可以作为附件发送。您可能需要这些接口。对于其他人来说,这确实是一个广泛的问题。您还需要使用合成,因为帖子应该有一个产品列表。@Bentaye ok,但它们应该如何存储在DB中?你认为这个界面应该是什么?它应该是虚拟的还是更有用的?保留3个表:POST、PRODUCTS和MAP\u POST\u PRODUCTS。当一篇文章包含一个产品时,您可以将映射放入MAP\u post\u PRODUCTS表。@Fuseled这是可以的,但是my 3项目中附加项目的
    消息
    表和列呢?谢谢您的回答,但是我们仍然对my 3项目中附加项目的
    消息
    表和列有问题,我们该怎么办?谢谢你的回答,我理解你的想法。但是我们仍然对问题中我的3个项目中的附加项目的
    消息
    表和列有问题,我们应该怎么做?@don prog我不理解您的问题,您已经说过,您将在MESSAGES表的
    attached_项中存储邮件或邮件附带产品的id。关于这一点,您还想知道什么?对不起,如果不清楚,我的意思是我们应该以某种方式将发送的
    Post
    产品的
    id
    存储在
    消息
    表的
    附加项
    列中。但是,如果
    Post
    Product
    在数据库中有不同的类型和不同的表,我们怎么能做到这一点呢?@don prog Right,您担心Post和Product可能具有相同的id?添加一个列
    附加的项目类型
    ,该列的值为
    post
    产品
    ,这样您就知道要在哪个表中查看它了up@Then那么带有messageId、postId、productId列的MESSAGE\u ATTACHED\u ITEM表呢?前两个ID中只有一个具有值,另一个保持为空
    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);