0

我对 OOP/OOD 很陌生,我意识到我有很多东西要学,所以我想请教 SO 社区的意见。

基本上,我使用的是 CakePHP 的 MVC 框架,而我正在构建的在线商店只使用 2 个模型,Category 和 Product,由以下 CREATE 语句描述:

CREATE TABLE `categories` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `name` varchar(255) default NULL,
    `parent_id` int(11) default NULL REFERENCES categories(`id`),
    `lft` int(11) default NULL,
    `rght` int(11) default NULL,
    PRIMARY KEY (`id`)
);
CREATE TABLE `products` (
    `id` int(11) unsigned NOT NULL auto_increment,
    `name` varchar(255) default NULL,
    `artist_id` int(11) default NULL REFERENCES artists(`id`),
    `description` text default NULL,
    `category_id` int(11) default NULL REFERENCES categories(`id`),
    `status` enum('in stock', 'pre-order', 'out of stock') NOT NULL,
    `price` decimal(6,2) default NULL,
    `picture` varchar(255) default NULL,
    `picture2` varchar(255) default NULL,
    PRIMARY KEY (`id`)
);

在线商店将包括:

  • 音乐
    • 光盘
    • DVD
  • 服饰
    • 连帽衫
    • T 恤
      • 长袖 T 恤
      • 娃娃装
    • 帽子
  • 其他商品
    • 贴纸
    • 海报
    • 手包
  • 下载
    • 铃声
    • MP3

基本上,这就是类别树的结构,尽管我们将来可能会添加新的类别。现在,所有产品都被视为 Product 类对象,它们的 category_id 是区分不同类型产品的唯一方法。在线商店也只是该网站的一部分。该网站的其余部分包含艺术家简历和唱片等信息;因此,我也有以下模型/表格:ArtistAlbumTrack

这是一个好方法吗?或者我应该为从 Product 类继承的 CD/T-shirts/MP3s/... 创建单独的子类?我想将商店中的每张音乐 CD 链接到唱片条目,以自动生成曲目列表和产品描述的其他信息。

如果这不是处理事情的好方法,你会怎么做呢?另外,我的类别/产品类中应该包含哪些方法/属性?我应该只在类别树的叶节点中列出产品吗?

编辑:
显然这个设计是不完整的。正如 Cyril 指出的那样,缺少 Product.price 字段,并且仍然没有关于销售的规定。实际上,我仍在努力研究如何最好地设计和实施商店的这些方面。最有可能的是,我将只使用另一个名为Orders的模型,但实际上处理订单变得更加复杂,因为我们根据运输目的地和订单包含的内容应用不同的运费。

4

5 回答 5

2

我更喜欢配置+行为方法而不是子类。

这可能是类别级别的一些行为。根据场景的不同,某些行为可能与单独的产品类型相关联,例如适用于某些产品的某些行为,而不管类别如何。对于最后一块吸烟建议也很有意义,因为您可以将这些额外的行为与其他类别相关联。这样,只要您正在处理已经编码的行为,您就可以添加新的类别来指示它将支持哪些行为。

一个小的变化是与类别而不是位相关联的行为列表。

额外的类将用于行为,而不是必须将它们全部混合在产品类下。如果您需要为这些额外的东西关联一个 UI,您可以将它与行为相关联,而不管产品类型如何。

于 2009-04-10T02:51:08.363 回答
1

是的,您可能应该为不同类型的产品创建单独的子类,特别是如果它们具有特定于类型的功能。就像您提到的自动生成曲目列表一样。

但即使没有这些,通过使用单独命名的产品类,您将在处理产品类型特定代码时使代码更具可读性和逻辑性。

您可能还想创建一个更具体的数据库模型。像

表:产品
prod_id
...常见的东西..

product_clothes
prod_id
...衣服特定的东西...

product_music
prod_id
...音乐特定的东西...

product_merch
prod_id
...商品特定的东西..

因为音乐没有以英寸为单位的尺寸,而衣服也没有比特率。

于 2009-04-10T00:37:19.573 回答
1

您应该跳过 category_id 列并将关系建模为更像标签云。您将希望将每个产品与一个或多个类别相关联。

您应该跳过 Artist_id 列并将关系建模为更像标签云。您最终会希望将某些产品与多个艺术家相关联。

类别已过时,您必须使用标签云。作为一条规则,您永远不应该使用引用语句创建表;除非表中的每一列都有引用语句。

于 2009-04-10T01:26:37.303 回答
1

如果您使用多态行为,您仍然可以保留 products 表并制作不同的“产品子类别” 。这是将所有通用数据保存在一个地方(价格等)的简单方法。

或者,您可以在表属性上使用相同的多态行为,并将任何特定于产品的内容添加为属性(名称=> 值对)。这完全取决于您的想法和数据量。

如果您计划拥有一个大型数据库,第一个解决方案可能会更好。

于 2009-04-10T13:42:37.953 回答
0

不,

您绝对不应该创建单独的子类,除非您需要一些无法通过简单的类别划分来实现的巨型魔术(例如自定义 T 恤徽标等)。即使在这种情况下,您也可以安全地在类别类中放置一个额外的标志字段(例如 HasLogo)。

但是这个设计还没有给我留下深刻印象。什么样的商店没有销售准备金?价格领域呢?

为了灵活起见,您还可以将图片放在单独的表格中。

你用 lft/rght 做什么?您可以使用简单的 Inde 属性来存储类别在树中的位置,但请记住,每次删除/添加类别时都需要更新。

于 2009-04-10T00:57:24.270 回答