0

我有两张桌子:tblCustomertblProduct

tblCustomer:
    Id: Integer, auto-increament
    Name: Varchar(30)
    ....

tblProduct
    Id: Integer, auto-increament
    Name: Varchar(50)
    customerId: Integer
    ....

和两个类:CustomerProduct

public class Product
{
    private int id;
    private int name;
    /* Other stuffs */
}

public class Customer 
{
    private int id;
    private String name;
    private String phoneNumber;

    /* get-set and others stuffs */

    public static boolean add(Customer cus) {
        /* This is for insert a customer to tblCustomer */
    }

    public boolean addProduct(Product pd) {
        /* This is for insert a product to tblProduct with current customer Id */
    }
}

当客户注册帐户时,它会调用:

Customer cus = new Customer(/* ... */);
Customer.add(cus);

当客户购买产品时:

Product pd = new Product(/* ... */);
currentCustomer.addProduct(pd);

但是我的老师说它在 OOAD(甚至 OOP)中不正确,因为Customer.addProduct它是在tblProduct桌子上操作的,对吗?这个案例有什么好的设计?

** 更新: ** 产品还没有预定义,当客户购买产品时,商店会制作并交付给客户,所以很少出现两个相同的产品,那么tblCustomerProduct需要吗?

4

4 回答 4

2

您的老师可能的意思是您需要第三张表,命名为“CustomerProduct”。此表包含客户之间的链接以及他们购买的产品。

tblCustomerProduct:
    Id: Integer, auto-increament
    CustomerId: Varchar(30)
    ProductId: Varchar(30)

因此,当客户购买产品时,您将此数据添加到表 CustomerProduct 中。这将删除冗余数据并使删除更容易

于 2013-05-03T09:56:27.353 回答
2

你的老师是对的。这不是好的设计,因为您创建的类应该是有凝聚力的。所以它应该负责做它可以做的事情。在您的产品类别中,您添加了客户 ID,这本质上是一种不好的做法,因为客户可能会购买多种产品。在这种情况下,这种设计将失败。而且 Product 类也不需要了解客户的任何信息。它只需要知道它自己。

客户与产品之间的关系是一种关联,可以表示为“客户购买产品”。所以客户 ID 不应该出现在产品表中。

关于currentCustomer.addProduct(pd);方法,它不太适合,因为它更适合产品类而不是客户类。

您的问题的简单解决方案可以是创建一个可以将产品和客户联系起来的新类。

例如

CustomerProduct

customerid
productid

在这个类中,您可以添加诸如“AddProductForCustomer”之类的方法,并可以编写保持一致性的数据库逻辑。

希望这可以消除您的疑问。

于 2013-05-03T10:00:32.737 回答
1

save添加一个 DAO 层,该层将包含方法、、delete等的逻辑部分update

以下是我通常的做法:

  • basepackage.domain: 包含您的所有实体(仅数据,没有逻辑部分- 在您的情况下 ProductCustomer
  • basepackage.dao: 包含你所有的 DAO,仅用于访问数据,基本上每个实体一个,每个包含方法,如findAll() : List<E>, findOne(K id) : E,save(E e) : void等。
  • basepackage.service: 包含你所有的服务,应用程序的逻辑部分。这些服务是唯一调用 DAO 的服务。
  • basepackage.presentation(或basepackage.web对于 webapp):包含 HMI/web services/... 实现。
于 2013-05-03T09:55:50.630 回答
1

在表中,客户被分配到一个产品,但在您给客户并添加产品的方法中。

所以我会选择一种方法 pd.setCustomer(currentCustomer) 而不是 currentCustomer.addProduct(pd)

或者将产品表中的客户字段更改为客户表中的产品字段。

于 2013-05-03T09:58:35.440 回答