基于数据库父表和子表对类建模的正确方法

时间:2017-03-11 11:07:31

标签: java mysql oop model-view-controller model

我认为最好向SO社区提问这个问题,他们比我更有经验。因为我还是学生。

我知道建模类并将它们与数据库表的关系相匹配会对代码可读性产生非常大的影响,尤其是当程序或系统在添加越来越多的代码时继续增长时。

说,我有实体客户地址订单

所以我认为它有以下代表实体的模型类。

//with getters and setters 
Customer 
Address
Order

数据访问对象 interfaces可能包含以下内容。

CustomerDao
List<Customer> getAllCustomers();
Customer getCustomerById(Customer customer);
boolean addCustomer(Customer customer);

AddressDao
List<Address> getAllAddress();
Address getAddressByCustomer(Customer customer);
boolean addAddress(Address address);

OrderDao
List<Order> getOrdersByCustomer(Customer customer);
boolean addOrder(Order order);

数据访问对象实施

//where I will define the Dao methods.
CustomerDaoImpl implements CustomerDao
AddressDaoImpl implements AddressDao
OrderDaoImpl implements OrderDao

我还没有尝试使用 MVC 模式在Java中编程,但我使用 DAO 模式。因此,在上面的示例中, DAO / DAOImpl 的工作方式类似于Controller,它负责从数据库存储和检索数据。

在架构透视图中,除了Customer,Address和Order之外,它可能还有其他表。 表格为customeraddressorder,也可能包含customer_addresscustomer_order等联接表。< / p>

我应该在编程Java方面创建 CustomerAddress CustomerOrder 类吗?

另请说我想使用getCustomerById()方法,最好使用Customer作为参数,而不是getCustomerById(customer)而不是getCustomerById(int customerId);

我被告知模型类表示数据库中某个表中的一行。

我知道大多数使用MVC框架的人可能有更简单的方法来生成代码并关联类&#39;使用不同IDE的模型。但是,如果我尝试使用匹配的数据库表对类进行建模,例如从头开始使用dao?

我很感激任何建议。我在项目中处理了我的部分ID getters,我使用模型作为getOrderByCustomerId(Customer customer)中的参数,而不是getOrderByCustomerId(int customerId);

如果您可以将最佳做法和更正添加到我对其进行建模的方式,那就太棒了。

谢谢。

1 个答案:

答案 0 :(得分:0)

我不太可能直接回答你如何对此进行建模,但想象一下,当你根本没有数据库时。你会怎么做?

当您以这种方式考虑它时,它可以帮助您在域和持久模块之间设置边界。没有任何持久性,您可以使用简单的HashMap作为内存存储。

然后这样的HashMap会提供客户ID到Customer的映射。让Customer为您提供Address和她Order。所有关于如何实现getAddressByCustomer的详细信息都是隐藏的,这将是封装的一个很好的例子。像

这样的东西
public static class Customers {
    private final Map<Integer, Customer> cache;

    public Customers(Map<Integer, Customer> cache) {
        this.cache = cache;
    }

    public Customer findById(Integer id) {
        return cache.get(id);
    }
}

public static class Customer {
    private final Address address;
    private final List<Order> orders;

    public Customer(Address address, List<Order> orders) {
        this.orders = orders;
        this.address = address;
    }

    public List<Orders> lastWeekOrders() {
        // I bet real people know what they bought last week...
        return ...;
    }
}

public static class Address {
}

public static class Order {
}

因此,Customers对象需要一个Cache来履行其职责以及它是如何做到的 - 他自己的事业。现在,比方说,您正在使用数据库,然后另一个Customers对象将被赋予对某种DataSource的引用,以便它可以针对它运行SQL。根据需要,它可以永久地或暂时地缓存某些东西,但是再一次 - 它的所有内部细节,没有人关心它是如何工作的。

当你有这样的事情时,它应该变得更加清楚,以及如何保持所有这些数据并不是非常重要。它可以是单个表,也可以是具有一对一或多对多关系的少数表。重要的是,本示例中只有一个Customers对象具有如何检索所有这些信息的一些知识。我并不是说我不关心表现,而是随后的表现。对于已知工作负载,我们可以创建特定索引。如果这很慢,我们可以通过不同的方式重新排列数据以获得更快的速度,甚至可能会使某些东西失真以获得更高的速度,但所有这些都是在测量之后,无论如何,这个设计所有这些细节都是将被封装在一个Customers实体中。

这样你最终会得到像CustomerAddress这样的真实物品,它们会知道自己的名字,年龄,他们生活和工作的建筑物,他们的最后命令等等。 DTO,它只能获取并设置一些字符和数字而不知道它是什么。没有办法以任何其他方式使用DTO,因为直接将它们映射到一堆表。

Customers对象可能看起来像DAO,但我认为它不是 - 取决于POV。 Hibernate也可以使用它的所有功能,懒惰,缓存等,但在Customers内,所以它位于边界的右侧。