成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

商品、訂單、購(gòu)物車(chē)和訂單商品快照的關(guān)系,初步了解成為架構(gòu)師的思想

hover_lew / 4834人閱讀

摘要:訂單快照,比如我們昨天購(gòu)買(mǎi)的商品材料,其當(dāng)時(shí)的零售價(jià)是元,但今天就變成了元。此時(shí)我們?cè)诰W(wǎng)頁(yè)上看到的材料價(jià)格是元,而我們付款的時(shí)候是元。商家是退給我們多少錢(qián)呢元,還是元當(dāng)然,是元,而不是元。這元存儲(chǔ)在哪里呢就是訂單快照表。

導(dǎo)讀

最近見(jiàn)同事在做訂單和訂單材料快照這方面的業(yè)務(wù),這其實(shí)就像淘寶上的商品,不過(guò),這里是材料商品了。它一共涉及到 五張表

材料表,材料的詳細(xì)信息

訂單表,用戶(hù)購(gòu)買(mǎi)材料時(shí)的記錄表

購(gòu)物車(chē),待付款材料

用戶(hù)表,誰(shuí)購(gòu)買(mǎi)了材料

訂單材料快照表,這就是訂單和材料的快照

因而,這里面就涉及到一對(duì)一的關(guān)系。

一對(duì)一的關(guān)系

雖然一對(duì)一的關(guān)系用的不多,但我們有時(shí)也會(huì)設(shè)計(jì)這方面的數(shù)據(jù)表,不常用不代表不用。

分表一般會(huì)使用一對(duì)一的關(guān)系,比如說(shuō)用戶(hù)表和用戶(hù)擴(kuò)展表。用戶(hù)表存儲(chǔ)用戶(hù)必填的信息,比如 賬號(hào)、性別、密碼、登錄時(shí)間、退出時(shí)間等。用戶(hù)擴(kuò)展表就是用戶(hù)的擴(kuò)展信息,比如愛(ài)好、昵稱(chēng)等。用戶(hù)可填可不填的。數(shù)據(jù)如果都放在同一張表中運(yùn)維人員會(huì)感覺(jué)比較亂。

如下,是部分的用戶(hù)實(shí)體和用戶(hù)擴(kuò)展實(shí)體的代碼:

用戶(hù)表的部分?jǐn)?shù)據(jù)
@Entity
@Table(name = "core_user")
public class User {
    
      /**
     * 用戶(hù)名,唯一
     */
    @NotEmpty(message = "用戶(hù)名不能為空")
    @Column(length = 100, unique = true, nullable = false)
    private String username;
    
    /**
     * 密碼
     */
    @Column(nullable = false, length = 66)
    private String password;
    
      /**
     * 用戶(hù)擴(kuò)展表
     */
    @OneToOne(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private UserExt userExt;
    
    。。。。
}
用戶(hù)擴(kuò)展表的部分?jǐn)?shù)據(jù)
@Entity
@Table(name = "core_user_ext")
public class UserExt implements Serializable {
 
    @OneToOne
    @PrimaryKeyJoinColumn
    private User user;

    /**
     * 自我介紹
     */
    @Lob
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "introduce", columnDefinition = "text")
    private String introduce;

    /**
     * 性別
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "gender", length = 20)
    private GenderEnum gender;


    /**
     * 昵稱(chēng)
     */
    @Column(name = "nick_name", length = 66)
    private String nickName;


    /**
     * 真實(shí)姓名
     */
    @Column(name = "real_name", length = 100)
    private String realName;
    
    /**
     * 頭像
     */
    @ManyToOne
    @JoinColumn(name = "head_image")
    private Picture headImage;

    /**
     * 聯(lián)系地址
     */
    @Column(name = "address", length = 200)
    private String address;

    /**
     * 郵政編碼
     */
    @Column(name = "postal_code")
    private String postalCode;

    @Column(name = "qq", length = 66)
    private String qq;

    /**
     * 身高
     */
    @Column(length = 3)
    private Integer height;

    /**
     * 喜歡的運(yùn)動(dòng)
     */
    @Column(name = "loved_sports", length = 255)
    private String lovedSports;

    /**
     * 喜歡的電影
     */
    @Column(name = "loved_movies", length = 255)
    private String lovedMovies;

    /**
     * 喜歡的音樂(lè)
     */
    @Column(name = "loved_musics", length = 255)
    private String lovedMusics;

    /**
     * 喜歡的食物
     */
    @Column(name = "loved_foods", length = 255)
    private String lovedFoods;

    /**
     * 喜歡的書(shū)
     */
    @Column(name = "loved_books", length = 255)
    private String lovedBooks;

    /**
     * 喜歡的游戲
     */
    @Column(name = "loved_games", length = 255)
    private String lovedGames;
}

用戶(hù)擴(kuò)展信息是用戶(hù)的輔助信息,它們適合一對(duì)一的關(guān)系。

詳解客戶(hù)材料(商品)、用戶(hù)材料(商品)、訂單、購(gòu)物車(chē)、用戶(hù)、和訂單商品快照

用戶(hù),是誰(shuí)購(gòu)買(mǎi)了這個(gè)商品,這是我們需要知道的。

材料商材料(材料商的商品),因?yàn)?,我們這個(gè)平臺(tái)主要是售賣(mài)裝修材料的,其分為兩部分。一部分是材料商在平臺(tái)上掛出他們的材料,材料商下的經(jīng)銷(xiāo)商購(gòu)買(mǎi)材料。他們購(gòu)買(mǎi)材料后,這就涉及另一部分,即經(jīng)銷(xiāo)商掛出他們的材料。這時(shí)才賣(mài)給用戶(hù),因而,對(duì)于經(jīng)銷(xiāo)商來(lái)說(shuō),還要有一個(gè)市場(chǎng)零售價(jià)。

經(jīng)銷(xiāo)商材料(經(jīng)銷(xiāo)商的商品):正如上面所說(shuō),我是經(jīng)銷(xiāo)商,從材料商那邊購(gòu)買(mǎi)了產(chǎn)品,然后,在我的這部分平臺(tái)上售賣(mài),此時(shí),用戶(hù)從我這邊購(gòu)買(mǎi)了,然后將其加入到購(gòu)物車(chē)中。

訂單,即為我們?cè)谫?gòu)買(mǎi)裝修材料時(shí)所生成的一條購(gòu)買(mǎi)記錄。

購(gòu)物車(chē),即為我們已經(jīng)選好了商品,暫時(shí)還沒(méi)有進(jìn)行付款,只是暫存起來(lái),這也是一條記錄。等我們付款的時(shí)候,就從購(gòu)物車(chē)中付款了。

訂單快照,比如我們昨天購(gòu)買(mǎi)的商品材料,其當(dāng)時(shí)的零售價(jià)是25元,但今天就變成了40元。我們拿到材料后,感覺(jué)不大合適,于是,申請(qǐng)退還材料。此時(shí)我們?cè)诰W(wǎng)頁(yè)上看到的材料價(jià)格是40元,而我們付款的時(shí)候是25元。商家是退給我們多少錢(qián)呢?25元,還是40元?當(dāng)然,是25元,而不是40元。這25元存儲(chǔ)在哪里呢?就是訂單快照表。我們?cè)诟犊畹哪且豢?,不管是直接?gòu)買(mǎi)的付款,還是從購(gòu)物車(chē)中的購(gòu)買(mǎi),就會(huì)生成一條訂單材料快照表??煺毡碛心男┬畔ⅲ阂粋€(gè)購(gòu)物車(chē)的外鍵,訂單的外鍵,裝修材料的中必須讓用戶(hù)知道的信息等。裝修材料從某種意義上來(lái)說(shuō),其也是一種一對(duì)一的關(guān)系,商品和快照找那個(gè)所存儲(chǔ)的主要的材料信息。

所有的信息,如以下代碼。不重要的或設(shè)計(jì)公司機(jī)密的信息,就不在這里展示了。

用戶(hù)表

這里用戶(hù)可以為分材料商和經(jīng)銷(xiāo)商,通過(guò)這個(gè)枚舉類(lèi)CustomerTypeEnum確定的。材料商和經(jīng)銷(xiāo)商放在同一張表中,根據(jù)他們的類(lèi)型,來(lái)確認(rèn)是材料商和經(jīng)銷(xiāo)商。

@Entity
@Table(name = "core_user")
public class User{

    /**
     * 用戶(hù)名,唯一
     */
    @NotEmpty(message = "用戶(hù)名不能為空")
    @Column(length = 100, unique = true, nullable = false)
    private String username;

    /**
     * 密碼
     */
    @Column(nullable = false, length = 66)
    private String password;

    /**
     * 最近登錄ip
     */
    @Column(name = "last_login_ip", length = 64)
    private String lastLoginIP;
    
   。。。。
材料商材料

因?yàn)椴牧仙淌且粋€(gè)實(shí)體,我們這里只要關(guān)聯(lián)材料商的外鍵即可,而且還是一對(duì)多的關(guān)系。因?yàn)?,材料表中某一個(gè)材料商的記錄不止一條。其次,還要有材料類(lèi)型,材料類(lèi)型表是樹(shù)結(jié)構(gòu)的,類(lèi)型下面還有子類(lèi)型。這里也是一對(duì)多的關(guān)系。

public class Material extends BaseObj {

    /**
     * 所屬品類(lèi)
     */
    @ManyToOne
    @JoinColumn(name = "material_category_id")
    private MaterialCategory materialCategory;

    /**
     * 名稱(chēng)
     */
    private String name;

    /**
     * 供應(yīng)商
     */
    @ManyToOne
    @JoinColumn(name = "supplier_id")
    private Supplier supplier;

    /**
     * 品牌
     */
    @ManyToOne
    @JoinColumn(name = "material_brand_id")
    private MaterialBrand materialBrand;

    /**
     * 成本價(jià)
     */
    @Column(name = "cost_price", precision = 12, scale = 2)
    private BigDecimal costPrice;

    /**
     * 零售價(jià)
     */
    @Column(name = "retail_price", precision = 12, scale = 2)
    private BigDecimal retailPrice;

    /**
     * 單位
     */
    @ManyToOne
    @JoinColumn(name = "unit_code")
    private DataDict unit;
    
    。。。
}
經(jīng)銷(xiāo)商材料

經(jīng)銷(xiāo)商從材料商那邊購(gòu)買(mǎi)了材料,經(jīng)銷(xiāo)商的材料即來(lái)源于材料這張表。因而,這個(gè)經(jīng)銷(xiāo)商材料只要關(guān)聯(lián)材料表即可。同時(shí),還要有確認(rèn)經(jīng)銷(xiāo)商是哪個(gè)經(jīng)銷(xiāo)商,因而,需要一個(gè)用戶(hù)的外鍵,即經(jīng)銷(xiāo)商材料的所有者。經(jīng)銷(xiāo)商有自己的定價(jià)規(guī)則,他需要定義一個(gè)市場(chǎng)價(jià)。

public class UserMaterial extends BaseObj {

    /**
     * 材料
     */
    @ManyToOne
    @JoinColumn(name = "material_id")
    private Material material;

    /**
     * 所有者
     */
    @ManyToOne
    @JoinColumn(name = "owner_id")
    private User owner;

    /**
     * 市場(chǎng)價(jià)
     */
    @Column(name = "market_price", precision = 12, scale = 2)
    private BigDecimal marketPrice;

   。。。
}
訂單

我們從經(jīng)銷(xiāo)商那邊購(gòu)買(mǎi)了材料,此時(shí),有條購(gòu)買(mǎi)記錄,這就是訂單。誰(shuí)發(fā)起的訂單,也就是說(shuō),誰(shuí)購(gòu)買(mǎi)的這個(gè)材料,因而,需要用戶(hù)的外鍵。

public class Order extends BaseObj {

    /**
     * 收貨地址
     */
    @ManyToOne
    @JoinColumn(name = "work_site_id")
    private WorkSite workSite;

    /**
     * 訂單編號(hào)
     */
    @Column(name = "order_no")
    private String orderNo;

    /**
     * 訂單狀態(tài)
     */
    @Enumerated(EnumType.STRING)
    private OrderStatusEnum status;

    /**
     * 訂單備注
     */
    @Column(name = "remark", columnDefinition = "longtext")
    private String remark;

    /**
     * 下單時(shí)間
     */
    @Column(name = "generate_time")
    private Date generateTime;

    /**
     * 提交時(shí)間
     */
    @Column(name = "submit_time")
    private Date submitTime;

    /**
     * 買(mǎi)家
     */
    @ManyToOne
    @JoinColumn(name = "buyer_id")
    private User buyer;
購(gòu)物車(chē)

我們已經(jīng)選好了材料,但還沒(méi)有確認(rèn)付不付款,于是,先在購(gòu)物車(chē)存著,想起來(lái)就付款。加入到購(gòu)物車(chē)的材料是經(jīng)銷(xiāo)商的材料,因而,購(gòu)物車(chē)需要存儲(chǔ)經(jīng)銷(xiāo)商的外鍵。同時(shí),還要確認(rèn)是誰(shuí)加入的購(gòu)物車(chē),因而購(gòu)物車(chē)需要用戶(hù)的外鍵。這都是一對(duì)多的關(guān)系。同時(shí),需要確認(rèn),這個(gè)購(gòu)物車(chē)是否被使用。

public class ShoppingCart extends BaseObj {

    /**
     * 用戶(hù)材料
     */
    @ManyToOne
    @JoinColumn(name = "user_material_id")
    private UserMaterial userMaterial;

    /**
     * 數(shù)量
     */
    @Column(name = "num", precision = 12, scale = 2)
    private Double num = 1.0;

    /**
     * 金額
     */
    @Column(name = "amount", precision = 12, scale = 2)
    private BigDecimal amount;

    /**
     * 所有者
     */
    @ManyToOne
    @JoinColumn(name = "owner_id")
    private User owner;

    /**
     * 是否被使用
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "is_used")
    private BooleanEnum isUsed = NO;
}
訂單材料快照表

這里,我們只要存儲(chǔ)訂單快照的id,而不是訂單快照的對(duì)象?為什么呢?首先,對(duì)于用戶(hù)來(lái)說(shuō),購(gòu)買(mǎi)裝修材料時(shí),這個(gè)購(gòu)物車(chē)是不常用的,因?yàn)椋麄円坏┛粗辛?,就?huì)直接購(gòu)買(mǎi)的。其次,如果我們存儲(chǔ)的是對(duì)象,用戶(hù)每次加載購(gòu)物車(chē)時(shí),都要從數(shù)據(jù)庫(kù)中遍歷當(dāng)前id的購(gòu)物車(chē)的數(shù)據(jù)庫(kù)的字段值,然后通過(guò)hibernate的反射封裝到購(gòu)物車(chē)的對(duì)象中。所以說(shuō)呢,無(wú)疑是減緩了效率,這樣不好。

需要訂單的外鍵,訂單和訂單快照雖然是一對(duì)一的關(guān)系,一個(gè)訂單一個(gè)訂單快照。也就是說(shuō),當(dāng)用戶(hù)生成訂單時(shí),就會(huì)有個(gè)訂單快照。用戶(hù)查看其購(gòu)買(mǎi)記錄(訂單記錄)的材料信息時(shí),材料信息不是來(lái)源于用戶(hù)材料表,而是來(lái)源于用戶(hù)訂單快照表。還有,用戶(hù)退還材料時(shí),經(jīng)銷(xiāo)商要查看用戶(hù)當(dāng)前購(gòu)買(mǎi)的材料信息。這就用到了訂單材料快照表。

public class OrderMaterialSnapshot extends BaseObj {

    /**
     * 購(gòu)物車(chē)id
     */
    @Column(name = "shopping_cart_id")
    private Long shoppingCartId;

    /**
     * 訂單
     */
    @ManyToOne
    @JoinColumn(name = "order_id")
    private Order order;

    /**
     * 狀態(tài)
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "status")
    private OrderMaterialStatusEnum status;

    /**
     * 購(gòu)買(mǎi)數(shù)量
     */
    @Column(name = "num", precision = 12, scale = 2)
    private Double num = 1.0;

    /**
     * 退貨數(shù)量
     */
    @Column(name = "refund_num")
    private Double refundNum = 0.0;

    /**
     * 購(gòu)買(mǎi)總金額
     */
    @Column(name = "amount", precision = 12, scale = 2)
    private BigDecimal amount;

    /**
     * 接單時(shí)間
     */
    @Column(name = "receive_time")
    private Date receiveTime;

    /**
     * 發(fā)貨時(shí)間
     */
    @Column(name = "deliver_time")
    private Date deliverTime;

    /**
     * 收貨時(shí)間
     */
    @Column(name = "receipt_time")
    private Date receiptTime;

    /**
     * 所屬品類(lèi)
     */
    @ManyToOne
    @JoinColumn(name = "material_category_id")
    private MaterialCategory materialCategory;

    /**
     * 名稱(chēng)
     */
    private String name;

    /**
     * 品牌
     */
    @OneToOne
    @JoinColumn(name = "material_brand_id")
    private MaterialBrand materialBrand;

    /**
     * 型號(hào)
     */
    private String model;

    /**
     * 零售價(jià)
     */
    @Column(name = "retail_price", precision = 12, scale = 2)
    private BigDecimal retailPrice;

    /**
     * 會(huì)員單價(jià)(材料商零售價(jià)*會(huì)員折扣)
     */
    @Column(name = "vip_unit_price", precision = 12, scale = 2)
    private BigDecimal vipUnitprice;

    /**
     * 市場(chǎng)價(jià)
     */
    @Column(name = "market_price", precision = 12, scale = 2)
    private BigDecimal marketPrice;

    /**
     * 單位
     */
    @ManyToOne
    @JoinColumn(name = "unit_code")
    private DataDict unit;
    
    。。。

}
總結(jié)

要想稱(chēng)為優(yōu)秀的架構(gòu)師,首先參考別人的架構(gòu),畢竟,他山之石,可以攻玉嗎?。?!

再接再厲,致奮斗的自己!??!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73677.html

相關(guān)文章

  • 50個(gè)關(guān)于MongoDB模型設(shè)計(jì)技巧

    摘要:另一個(gè)時(shí)間點(diǎn)的一致性很重要,對(duì)于難以協(xié)調(diào)不一致的應(yīng)用程序。應(yīng)該將模式設(shè)計(jì)為按應(yīng)用程序單元進(jìn)行查詢(xún)。 #1:速度優(yōu)先使用嵌入數(shù)據(jù),完整性?xún)?yōu)先使用引用數(shù)據(jù) 多個(gè)文檔使用的數(shù)據(jù)可以使用嵌入(非規(guī)范化)或引用(規(guī)范化)。非規(guī)范化并不一定比規(guī)范化更好,反之亦然:每種方式都有自己的權(quán)衡,你應(yīng)該選擇最適合你的應(yīng)用程序的方式。 非規(guī)范化可能導(dǎo)致數(shù)據(jù)不一致:假設(shè)您想要將圖1-1中的蘋(píng)果更改為梨。如果更新...

    sf190404 評(píng)論0 收藏0
  • Laravel 教程 - 實(shí)戰(zhàn) iBrand 開(kāi)源電商 API 系統(tǒng)

    摘要:最佳實(shí)踐良好的編碼規(guī)范單元測(cè)試持續(xù)集成文檔,從一開(kāi)始就形成良好的編碼習(xí)慣。真實(shí)的電商業(yè)務(wù)所有的業(yè)務(wù)需求來(lái)自真實(shí)的客戶(hù),并且線(xiàn)上良好運(yùn)營(yíng)中。 重要通知: Laravel + 小程序的開(kāi)源電商版本源碼已經(jīng)在 github 上拉,歡迎提交 issue 和 star :) 開(kāi)源電商 Server 端: Laravel API源碼 開(kāi)源電商 client 端:小程序源碼 iBrand 簡(jiǎn)介...

    iOS122 評(píng)論0 收藏0
  • PHP面試題

    摘要:質(zhì)量高在設(shè)計(jì)時(shí),可重用現(xiàn)有的,在以前的項(xiàng)目的領(lǐng)域中已被測(cè)試過(guò)的類(lèi)使系統(tǒng)滿(mǎn)足業(yè)務(wù)需求并具有較高的質(zhì)量。代碼塊捕獲異常,并創(chuàng)建一個(gè)包含異常信息的對(duì)象。這樣可以解決超賣(mài)的問(wèn)題,但是會(huì)導(dǎo)致文件得開(kāi)銷(xiāo)很大。 6.你們公司是使用什么框架? 答:我們公司采用的是TP框架,運(yùn)用的mysql+apache+php進(jìn)行開(kāi)發(fā),因?yàn)門(mén)P框架是一個(gè)免費(fèi)開(kāi)源的,輕量級(jí)的php開(kāi)發(fā)框架,而且是我們中國(guó)人自己開(kāi)發(fā)的,...

    ls0609 評(píng)論0 收藏0
  • UML統(tǒng)一建模語(yǔ)言

    摘要:什么是全稱(chēng)是又稱(chēng)統(tǒng)一建模語(yǔ)言或標(biāo)準(zhǔn)建模語(yǔ)言。于是乎,為了統(tǒng)一起來(lái),就有了組織對(duì)象管理組織,這個(gè)組織讓這種描述需求設(shè)計(jì)的語(yǔ)言統(tǒng)一了,就稱(chēng)作是了。 什么是UML? UML全稱(chēng)是:Unified Modeling Language 又稱(chēng)統(tǒng)一建模語(yǔ)言或標(biāo)準(zhǔn)建模語(yǔ)言。 是一個(gè)支持模型化和軟件系統(tǒng)開(kāi)發(fā)的圖形化語(yǔ)言,為軟件開(kāi)發(fā)的所有階段提供模型化和可視化支持,包括由需求分析到規(guī)格,到構(gòu)造和配置。它是...

    ninefive 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<