MongoDB 如何使定制电子商务变得简单

开源电子商务软件市场已经历了众多发展阶段,您可能已经通过 osCommerce、Magento、Zen Cart、PrestaShop、Spree 等流行平台而有所了解。这些平台经常用作定制电子商务软件的基础,都要求使用一个 SQL 数据库。由于开源软件在适应定制功能时存在固有的挑战,现在看来 MongoDB 将在电子商务的下一轮发展进化中扮演着重要角色。

Kyle Banker 是 2010 年 4 月第一批就 MongoDB 和电子商务 发表博客的人,自那以后就令人意外地很少出来此类文章。在博客中,Kyle 写到了 Magento 及其他基于 SQL 的平台:“您将看到的是,大量表格共同作用,在数据库系统基础不太灵活的型式上提供灵活的结构。”

对此我们必须问,灵活的结构在电子商务中为什么如此重要?

开源平台意味着可以适应许多不同的设计、折算流和商业流程。灵活的结构可以通过为开发者提供一种将自定义数据结构与平台现有模型相关联的方法,从而带来帮助。如果没有灵活的结构,开发者就必须跨越重重障碍来实现某种特殊功能。当建立和维持自定义功能的成本过高时,可以作出的选择有:放弃功能,以另一平台重新开始,或按草案建立一个平台。这些都是昂贵的提案。

还有更好的方法

过支几年来,我们一直在开发 Forward,这是一种与 MongoDB 相配合的新开源电子商务平台 。自 2012 年 3 月以来,它就已经投入了生产使用中,并最终印证了一点,即我们可以展示 MongoDB 的无结构设计为自定义功能开发带来的优势。

以下示例展示了 Forward 与其他平台类似的 ORM 惯例,它仅在平台本身中提供,但其基本理念直接映射到了 MongoDB 的文件结构。在此情况下,考虑将 get() 作为 db.collection.find() — put() 作为 insert/update() — post() 作为 insert() — delete() 作为… delete()。

更快原型化

大多数电子商务网站都代表着小公司,在这里,高效执行是网络平台的最重要方面。当 MongoDB 的灵活文件结构通过平台的模型界面执行时,添加自定义字段变得比以往任何时候都更简单。

例如,让我们假设您需要一种在向产品中添加多项自定义属性时进行管理的简单视图。下面是为实现该目的的基本示例,以 Forward 的模板语法编写:

{args $product_id}

{if $request.post}
    {$product = put("/products/$product_id", [
        spec => $params.spec,
        usage => $params.usage
    ])}
    {flash notice="Saved" refresh=true}
{else}
    {$product = get("/products/$product_id")}
{/if}

<for method="post">
    <div class="field">
        <label>Product specification</label>
        <textarea name="spec">{$product.spec|escape}</textarea>
    </div>
    <div class="field">
        <label>Product usage instructions</label>
        <textarea name="usage">{$product.usage|escape}</textarea>
    </div>
    <button type="submit">Save product</button>
</form>

该模板有什么作用可能很明显,但不明显的是平台对于 “spec” 或 “usage” 字段一无所知,但对待它们的方式却好象电子商务数据模型专为它们而设计。数据库完全无需迁移,只有代码需要。

您可能反驳称,这可以通过模糊 SQL 数据库结构来实现,您也可能是对的,但它对于标准数据库工具来说不完美,或者说无法读取。在自定义字段上的 Ad-hoc 查询会变得很困难。

自定义字段上的查询

如果我们所需要的是自定义密钥/价值存储,那么您可能不会从灵活结构中受益太多。MongoDB 真正耀眼之处是其在任何文件字段(甚至包括嵌入式文件)上查询的能力。

{get $oversized_products from "/products" [
    oversized => true,
    active => true
]}

这里有 {$oversized_products.count} 活动的超大产品

这些字段可能也可能不为电子商务 API 所知,但在此情况下,MongoDB 的查询语法只能找到具有匹配字段的文件。

不再有关系复杂性

对于那些花费数年时间编写关系 SQL 查询的人,这是一大改变。没有连接我们如何创建数据关系?有很多种不同的战略,但 Forward 将一个字段定义为静态值或回拨方法。这允许一个字段根据查询返回另一个文件或集合。结果便是一个能够无需连接便浏览关系的数据模型。例如 (PHP):

// class Accounts extends AppModel
...
$this->fields => array(
    ...
    'orders' => function ($order) {
        return get("/orders", array('account_id' => $account['id']));
    }
);

该关系可用以类似以下的模板中:

{get $account from "/accounts/$session.account_id"}

您已处理

<table>
    {foreach $account.orders as $order}
        <tr>
            <td>#{$order.id}</td>
            <td>${$order.sub_total}</td>
            <td>${$order.grand_total}</td>
            <td>{$order.items|count} item(s)</td>
        </tr>
    {/foreach}
</table>

关系可通过简单或复杂的查询来定义。结果为延迟载入,使该示例成为可能:

{get $order from "/orders/123"}

{$order.account.name} placed {$order.account.orders.count} orders since {$order.account.orders.first.date_created|date_format}

// Output: John Smith placed 3 orders since Jun 14, 2012
事务怎么样?

许多人提出 MongoDB 在集合中缺少原子性事务作为证据,不适合电子商务应用。迄今为止,这一直不是我们经验中的重要障碍。

还有其他方法可以实现数据完整性。在具有中低数据冲突的系统中,乐观锁很充分。我们会在随后分享有关这些战略的更多细节。

总结

有了 MongoDB,电子商务软件的未来一片光明。是时候另辟蹊径了,回旋式结构、复杂关系查询和令人恐惧的数据库迁移都已成为过去。如果您有兴趣在公开发布之前与 Forward 合作,请考虑 加入私人测试 ,帮助我们令开源电子商务再度重现世界原本知道的状态。

来自开发者/创建人 Eric Ingram 的访客帖,请跟随 @getfwd

原文:MongoDB如何简化电子商务

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯移动品质中心TMQ的专栏

基于网页分析的可播放性测试

到周末了,有空啦,很多同学就会拿起手机,打开QQ浏览器,点开热门视频,弄几个视频来犒劳犒劳自己,放松一下,搜索个片子,打开,额,播放不了: ? 再试试看,...

3135
来自专栏Java架构

Java分布式架构的演进过程

1946年,世界上第一台电子计算机在美国的宾夕法尼亚大学诞生,它的名字是:ENICAC ,这台计算机的体重比较大,计算速度也不快,但是而代表了计算机时代的到来,...

1986
来自专栏北京马哥教育

Python爱好者必看11个常用站点

学习一门编程语言,除了语法,最重要的是学习解决问题。很多时候单凭自己的能力确实无法做到完美解决,所以无论是搜索引擎、社区、文档还是博客,都是我们解决问题的利器。...

3434
来自专栏云计算D1net

服务器虚拟化在数据中心中的实施与应用

随着高校信息化不断发展,学校的教学科研管理全部实现数字化,对服务器硬件的需求不断加大。数据中心机房资源日趋紧张,然而通过对数据中心全局服务器设备使用情况的调查发...

5197
来自专栏魏艾斯博客www.vpsss.net

腾讯云数据库专场特惠 2.5 折起 新用户 1 元体验 2060 元升级/续费大礼包免费领

腾讯云数据库专场特惠活动开始,大家知道腾讯云是国内重量级的云服务提供商,和阿里云一样也占据了国内云服务器的很大市场份额。这次针对云数据库的专场特惠,腾讯云也拿出...

2183
来自专栏数据库新发现

好消息---Gmail增加免费POP3支持

Google网页数扩至80亿 增加免费POP3支持 (2004.11.12)   来自:ZDNET    在发布到Google公司blo...

1434
来自专栏非著名程序员

是的,我又开发了一款产品,堪称效率神器

? 是的,最近我玩上了微信小程序,感觉开发这个还是蛮有意思的,所以,我又开发了一款小程序,邀请大家一起来看看,顺便欣赏一下。还请大家提提意见。 是的,继「活动...

3775
来自专栏跨界架构师

分布式系统关注点——初识「高可用」

        咳咳,从这篇开始,正式拉开分布式系统关注点中,我认为第二重要的内容 —— 「高可用」。

1053
来自专栏美团技术团队

孵化业务快速落地与优化

海外酒店是酒旅事业群第一个孵化的业务,从2016年9月份开始到现在已经半年多的时间。在业务后台搭建、成长、优化过程中,经历了很多的思考与选择。 主要分为下面几个...

4359
来自专栏云加头条

【腾讯云的1001种玩法】征文活动

腾讯云技术社区「腾云阁」上线以来得到了广大程序员们的支持,为了吸引更多的开发者入驻,现再次举办【腾讯云的1001种玩法】征文活动。只要是与「腾讯云」相关的干货原...

6.2K0

扫码关注云+社区

领取腾讯云代金券