精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一種優(yōu)雅實現(xiàn)多表查詢的新思路

數(shù)據(jù)庫
AC架構不是銀彈,不適用于所有場景。對于需要精細化管理接口的業(yè)務,還是要拆開一個個接口去寫;而對于小而美的微服務、單表CRUD比較多的管理后臺,采用AC架構可以節(jié)省大量重復性編碼。

哈嘍,各位代碼戰(zhàn)士們,我是Jensen,一個夢想著和大家一起在代碼的海洋里遨游,順便撿起那些散落的知識點的程序員小伙伴。

上一篇文章有一些小伙伴在吐槽我的AC架構:

這里我統(tǒng)一補充:AC架構不是銀彈,不適用于所有場景。對于需要精細化管理接口的業(yè)務,還是要拆開一個個接口去寫;而對于小而美的微服務、單表CRUD比較多的管理后臺,采用AC架構可以節(jié)省大量重復性編碼。

也有很多小伙伴私信我:使用AC架構怎么解決聯(lián)表查詢問題?本文將為大家揭曉。

本文涉及技術點:存儲方式、內(nèi)存聚合。

一、冗余存還是范式存

在數(shù)據(jù)庫設計中,冗余存儲(Redundant Storage)和范式存儲(Normal Form Storage)是兩種不同的數(shù)據(jù)組織方式,它們各自有不同的優(yōu)缺點。

冗余存儲的優(yōu)缺點:

優(yōu)點:

  • 查詢性能:冗余存儲可以通過減少連接操作來提高查詢性能,因為所需數(shù)據(jù)已經(jīng)被存儲在了同一個地方。
  • 減少I/O:在查詢時,可以減少磁盤I/O操作,因為所有數(shù)據(jù)都在同一個表中。
  • 簡化應用邏輯:應用層不需要處理復雜的多表關聯(lián),簡化了應用邏輯。

缺點:

  • 數(shù)據(jù)不一致:冗余數(shù)據(jù)可能導致數(shù)據(jù)不一致性問題,特別是在數(shù)據(jù)更新時,需要確保所有冗余的副本都被正確更新。
  • 存儲空間:冗余存儲會占用更多的存儲空間,因為相同的數(shù)據(jù)在多個地方被存儲。
  • 維護困難:隨著數(shù)據(jù)量的增加,冗余數(shù)據(jù)的維護變得更加困難,任何結(jié)構變更都可能涉及到多個表的修改。

范式存儲的優(yōu)缺點:

優(yōu)點:

  • 數(shù)據(jù)一致性:范式化減少了數(shù)據(jù)冗余,有助于保持數(shù)據(jù)一致性。
  • 存儲效率:通過消除重復數(shù)據(jù),可以節(jié)省存儲空間。
  • 數(shù)據(jù)完整性:范式化有助于實施數(shù)據(jù)完整性約束,如實體完整性、參照完整性等。

缺點:

  • 查詢性能:范式化可能導致查詢性能下降,因為需要執(zhí)行多表連接來獲取完整數(shù)據(jù)。
  • 增加I/O:多表連接可能會增加磁盤I/O操作,特別是在涉及大型表的情況下。
  • 復雜查詢:應用層可能需要編寫更復雜的SQL查詢來處理多表關聯(lián)。

我們再復習一下大學老師教過的數(shù)據(jù)庫范式(Normal Forms):

范式化是數(shù)據(jù)庫設計中的一個概念,旨在減少數(shù)據(jù)冗余和提高數(shù)據(jù)完整性。有幾種不同的范式,包括:

  • 第一范式(1NF):每個表格的每個列都是不可分割的基本數(shù)據(jù)項。
  • 第二范式(2NF):在1NF的基礎上,所有非主屬性完全依賴于主鍵。
  • 第三范式(3NF):在2NF的基礎上,沒有傳遞依賴,即非主屬性只能依賴于主鍵,不能依賴于其他非主屬性。

在實際應用中,完全遵循范式化可能會導致查詢性能問題,因此通常會根據(jù)實際情況進行適度的反范式化(Denormalization),即有意引入一些冗余來優(yōu)化性能。

設計數(shù)據(jù)庫時,需要在數(shù)據(jù)一致性、存儲效率和查詢性能之間做出權衡。

二、走進“聚合”

“聚合”二字經(jīng)常出現(xiàn)在程序員之間、程序員與產(chǎn)品經(jīng)理的對話中,雖然產(chǎn)品不懂技術語言,他們只管給客戶實現(xiàn)特定需求,為技術提供產(chǎn)品原型,但是技術比較關心到底是冗余存還是范式存。

如果涉及的數(shù)據(jù)需要分表存儲,單表查滿足不了客戶需求,這時就需要進行數(shù)據(jù)聚合,傳統(tǒng)的方式是寫SQL,Join連接多張表,返回多張表的數(shù)據(jù)給前端,這種方式對數(shù)據(jù)庫查詢有一定的壓力,整體性能雖然較好,但缺點也很明顯:

隨著業(yè)務量越來越大,工程里的SQL會滿天飛,并且SQL會寫得越來越復雜,對維護SQL的人簡直是噩耗!

這意味著什么?代碼寫了兩三年后,SQL已經(jīng)很難維護了,沒人敢動,每次看SQL都特別費勁,還不知道哪一天會出現(xiàn)慢SQL。

其實除了寫SQL語句,我們還能通過倉庫實現(xiàn)層做數(shù)據(jù)聚合,這就是所謂的“內(nèi)存Join”,把數(shù)據(jù)庫壓力轉(zhuǎn)移到了不要錢的CPU與內(nèi)存中,具體方法如下:

  • 查詢參數(shù)Query對象添加Boolean fillXxx字段,用于控制是否要聚合。
  • 倉庫實現(xiàn)XxxRepositoryImpl實現(xiàn)fill(Query query, List<Model> models)方法,models就是查詢出主表的結(jié)果集,通過query.fillXxx=true控制聚合其他表的數(shù)據(jù)。

這個fillXxx就是聚合參數(shù),大多數(shù)情況下是默認關閉的,也就是默認還是單表查詢,如果需要聚合,由前端傳參控制,這樣既可以兼顧性能,也可以兼顧功能,我們按需聚合數(shù)據(jù)即可。

下面我們看看一個真實案例,預約單倉庫實現(xiàn),聚合預約主體、預約記錄、預約主體評價:

/**
 * 預約單倉庫實現(xiàn)
 */
@Repository
public class AppointmentOrderRepositoryImpl extends
        BaseRepositoryImpl<AppointmentOrderMapper, AppointmentOrder, AppointmentOrderPO, AppointmentOrderQuery> implements
        AppointmentOrderRepository {


    // 聚合方法
    @Override
    public void fill(AppointmentOrderQuery query, List<AppointmentOrder> appointmentOrders) {
        Map<String, AppointmentOrder> orderId2appointment = appointmentOrders.stream().collect(Collectors.toMap(AppointmentOrder::getOrderId, o -> o));
        if (query.getFillAppointment()) {
            // 聚合預約主體
            this.fillAppointment(appointmentOrders);
        }
        if (query.getFillAppointmentRecords()) {
            // 聚合預約記錄列表
            this.fillAppointmentRecords(orderId2appointment);
        }
        if (query.getFillAppointmentComment()) {
            // 聚合預約主體評論
            this.fillAppointmentComments(appointmentOrders);
        }
    }


    private void fillAppointment(List<AppointmentOrder> appointmentOrders) {
        // 通過預約單的主體ID列表(去重)查詢主體
        Set<String> appointIds = appointmentOrders.stream().map(AppointmentOrder::getAppointId).collect(Collectors.toSet());
        List<Appointment> appointments = AppointmentQuery.builder().idIn(appointIds).build().list();
        if (CollKit.isEmpty(appointments)) {
            return;
        }
        // 按主體ID映射,把主體的信息寫到預約單內(nèi)
        Map<String, Appointment> map = appointments.stream().collect(Collectors.toMap(Appointment::getId, o -> o));
        for (AppointmentOrder appointmentOrder : appointmentOrders) {
            Appointment appointment = map.get(appointmentOrder.getAppointId());
            if (appointment != null) {
                appointmentOrder.setAppointment(appointment);
                appointmentOrder.setAppointName(appointment.getName());
            }
        }
    }


    private void fillAppointmentRecords(Map<String, AppointmentOrder> orderId2appointment) {
        // 查出指定預約單ID列表的預約記錄
        List<AppointmentRecord> appointmentRecords = AppointmentRecordQuery.builder().orderIdIn(orderId2appointment.keySet()).fillTimeSchedules(true).build().list();
        if (CollKit.isEmpty(appointmentRecords)) {
            return;
        }
        // 按預約單ID分組,讓預約單關聯(lián)多條預約記錄
        Map<String, List<AppointmentRecord>> map = appointmentRecords.stream().collect(Collectors.groupingBy(AppointmentRecord::getOrderId));
        for (String id : map.keySet()) {
            orderId2appointment.get(id).setAppointmentRecords(map.get(id));
        }
    }


    private void fillAppointmentComments(List<AppointmentOrder> appointmentOrders) {
        // 查出指定預約單ID列表的主體評論
        List<String> orderIds = appointmentOrders.stream().map(AppointmentOrder::getOrderId).collect(Collectors.toList());
        List<AppointmentComment> appointmentComments = AppointmentCommentQuery.builder().orderIdIn(orderIds).build().list();
        if (CollKit.isEmpty(appointmentComments)) {
            return;
        }
        // 按預約單ID分組,讓預約單關聯(lián)首條預約主體評論
        Map<String, List<AppointmentComment>> map = appointmentComments.stream().collect(Collectors.groupingBy(AppointmentComment::getOrderId));
        for (AppointmentOrder appointmentOrder : appointmentOrders) {
            appointmentOrder.setAppointmentComment(CollKit.isNotEmpty(map.get(appointmentOrder.getOrderId())) ? map.get(appointmentOrder.getOrderId()).get(0) : null);
        }
    }


}

需要注意的是,fill方法要對多條結(jié)果進行批量處理,如果是單個結(jié)果,每一條結(jié)果都需要聚合多表數(shù)據(jù),那勢必會加大內(nèi)存與數(shù)據(jù)庫連接的負擔。以上預約單表聚合其他三張表,比SQL的Join多調(diào)了3次查詢,但好在邏輯清晰,減少維護SQL的負擔。

聚合查詢的打開方式就很簡單了,如果前端不傳聚合參數(shù),那么由后端接口來控制:

// 設置聚合參數(shù)(或由前端傳入)
query.setFillAppointment(true);
query.setFillAppointmentRecords(true);
query.setFillAppointmentComment(true);
// 分頁查詢后,會自動調(diào)用fill方法,對結(jié)果集聚合
Page<AppointmentOrder> page = query.page();
// 調(diào)用聚合方法(以下代碼在D3Boot框架內(nèi)已實現(xiàn),不需要寫)
appointmentOrderRepository.fill(query, page.getRecords());

我們通過這種方式來靈活聚合多表數(shù)據(jù),不僅不用改動Controller,還能兼顧多種數(shù)據(jù)聚合的場景,這種數(shù)據(jù)的聚合,不一定要聚合數(shù)據(jù)庫的數(shù)據(jù),也能聚合第三方接口的數(shù)據(jù)。倉庫接口只關心需要提供什么數(shù)據(jù)即可,怎么聚合數(shù)據(jù)、數(shù)據(jù)源來自哪兒,是倉庫實現(xiàn)要負責的事情。

三、寫在最后

目前這種聚合方式也只適用于大部分場景,對于多張大表的聚合,還得考慮是用數(shù)據(jù)庫Join還是內(nèi)存Join的方式進行,或者在設計的時候就要考慮冗余存而不是范式存。

責任編輯:姜華 來源: 架構師修行錄
相關推薦

2024-04-26 08:58:54

if-else代碼JavaSpring

2024-04-30 08:12:05

CRUD方法JavaAC架構

2022-06-23 07:05:46

跳板機服務器PAM

2016-10-26 09:12:58

2017-08-24 15:02:01

前端增量式更新

2023-09-17 23:16:46

緩存數(shù)據(jù)庫

2018-04-18 07:34:58

2025-01-27 13:00:00

2020-11-27 14:45:57

開發(fā)服務器代碼

2019-11-22 09:21:17

技術研發(fā)數(shù)據(jù)

2016-10-13 10:57:55

phptcp專欄

2021-05-18 06:22:39

CSS 制作波浪技巧

2017-01-23 11:18:16

戴爾

2009-12-03 10:32:21

2010-11-22 15:56:34

Mysql多表查詢

2010-10-14 14:28:03

Mysql多表查詢

2020-09-16 14:01:10

Vue.js項目語言

2024-05-16 08:37:12

FLIPFirst前端動畫思維

2009-06-03 15:38:37

Struts框架RBAC

2013-05-22 15:31:07

AOP的CGlib實現(xiàn)
點贊
收藏

51CTO技術棧公眾號

在线免费看视频| 成人中文字幕在线播放| 影音先锋黄色网址| 天堂美国久久| 精品日韩欧美一区二区| 国产人妻777人伦精品hd| 欧美套图亚洲一区| 久久国产三级精品| 欧美激情奇米色| 中文字幕av网址| 国产成人久久精品麻豆二区| 伊人夜夜躁av伊人久久| 久久精品美女| 亚洲一区二区激情| 日韩视频三区| 中文欧美日本在线资源| 在线播放av网址| 中文.日本.精品| 一区二区三区精品| 天堂av一区二区| 人妻少妇精品无码专区| 美女在线视频一区| 8x拔播拔播x8国产精品| 欧美手机在线观看| 精品国产一区探花在线观看| 日韩西西人体444www| 免费在线观看的毛片| 天天色天天射天天综合网| 国产亚洲欧美激情| 国产精品日韩高清| 国产又粗又黄又爽视频| 久久久777| 久久久综合av| 欧美一区免费观看| 俺要去色综合狠狠| 亚洲美女黄色片| 欧美日韩人妻精品一区在线| 国产不卡精品在线| 精品视频一区三区九区| 欧美精品一区二区三区免费播放| 国产第一页在线视频| 成人免费在线视频| 亚洲精品8mav| 成人免费高清在线播放| 91视频国产观看| 国产精选在线观看91| 99热这里只有精品在线| 麻豆国产精品视频| 国产精品免费网站| 337p粉嫩色噜噜噜大肥臀| 国产精品久久久亚洲一区| 欧美高清视频在线| 欧美一区二区三区爽爽爽| 日韩在线二区| 中文字幕亚洲国产| 久久精品国产亚洲av久| 亚洲综合图色| 亚洲深夜福利在线| 欧美大波大乳巨大乳| 蜜臀av免费一区二区三区| 日韩极品精品视频免费观看| 成人在线视频免费播放| 日本在线中文字幕一区| 亚洲第一页在线| 日韩www视频| 青青草久久爱| 亚洲女同性videos| 三区四区在线观看| 欧美国产美女| 日韩中文视频免费在线观看| 无码人妻精品中文字幕| 亚洲国产一成人久久精品| 久久亚洲电影天堂| 免费人成在线观看| 国产精品日韩欧美一区| 欧美孕妇孕交黑巨大网站| 欧美成人一区二区三区四区| 日韩精品1区2区3区| 国产精品久久久久久超碰| 中文字幕第31页| 精品亚洲成a人| 成人午夜电影免费在线观看| 欧美自拍第一页| 久久综合国产精品| 亚洲图片在线观看| 三级福利片在线观看| 午夜视频在线观看一区| 蜜臀久久99精品久久久酒店新书| 四虎4545www精品视频| 欧美日韩精品三区| 亚洲av综合色区无码另类小说| 美女呻吟一区| 中文字幕av一区中文字幕天堂| 日韩一级片大全| 国产亚洲精品v| 国产欧美一区二区三区视频| 国产日本精品视频| 99国产精品久久久| 亚洲日本japanese丝袜| 久草在线新免费首页资源站| 日韩欧美中文免费| 午夜啪啪小视频| 美女av一区| 日韩色av导航| 成人免费看片98欧美| 免费高清视频精品| 国产精品久久久久久久久久久久冷| 亚洲欧洲综合在线| 亚洲精品欧美专区| 亚欧在线免费观看| ady日本映画久久精品一区二区| 亚洲丝袜一区在线| 久久久精品视频在线| 丝袜美腿亚洲一区| 国产乱码一区| 欧美videos极品另类| 天天色天天爱天天射综合| www.99r| 国产欧美自拍一区| 久久久av亚洲男天堂| 在线观看亚洲天堂| 国产乱妇无码大片在线观看| 日本电影一区二区三区| av剧情在线观看| 4438x亚洲最大成人网| 熟女俱乐部一区二区视频在线| 亚洲欧美一级二级三级| 国产女人精品视频| 男人的天堂在线| 亚洲成人av电影在线| 一区二区三区国产好的精华液| 欧美男同视频网| 992tv成人免费视频| 99视频国产精品免费观看a| 国产精品丝袜久久久久久app| 成人毛片视频网站| 欧美尿孔扩张虐视频| 欧美成人精品在线观看| 91免费视频播放| 国产日韩亚洲欧美综合| 国产一区二区在线视频播放| 日本精品在线播放| 成年无码av片在线| 国产伦理吴梦梦伦理| 国产精品美女一区二区在线观看| 能在线观看的av网站| 日韩高清成人在线| 欧美做爰性生交视频| 水莓100国产免费av在线播放| 亚洲午夜免费视频| 在线精品视频播放| 日韩视频三区| 快播日韩欧美| 中文字幕在线高清| 亚洲日本成人女熟在线观看| 亚洲精品男人的天堂| 久久中文字幕电影| 黑鬼大战白妞高潮喷白浆| 国产在线观看91一区二区三区 | 欧美日韩国产在线看| 亚洲女则毛耸耸bbw| 亚洲一级二级| 国产综合第一页| 蜜桃视频在线观看免费视频| 国产视频自拍一区| 亚洲 国产 日韩 欧美| 中文文精品字幕一区二区| wwww.国产| **女人18毛片一区二区| 91九色在线免费视频| 成年人视频免费在线播放| 亚洲精品大尺度| 国产免费一区二区三区四区五区 | 欧美一区二区视频观看视频| caoporn91| 成人av影院在线| 男女午夜激情视频| 日韩欧美电影| 99re资源| 波多野结衣久久精品| 日韩一区av在线| 成人午夜福利视频| 色噜噜狠狠色综合欧洲selulu| 夫妇交换中文字幕| 国产精品影视在线| 国产精品97在线| 欧美a级成人淫片免费看| av在线不卡一区| 亚洲日本天堂| 久久九九亚洲综合| 五月天婷婷在线播放| 欧美日韩一二区| 国产一级理论片| 国产欧美一区二区三区鸳鸯浴| 999热精品视频| 国产亚洲一级| 国产精品美女在线播放| 亚洲精品合集| 不卡一卡2卡3卡4卡精品在| 免费成人直播| 欧美日韩成人在线视频| 国产污视频在线| 精品国产一区久久| 亚洲网站免费观看| 五月婷婷欧美视频| 中文字幕观看av| 久久综合99re88久久爱| 精产国品一区二区三区| 日韩制服丝袜av| 性高湖久久久久久久久aaaaa| 精品一区二区三区的国产在线观看| av观看久久| 9999在线精品视频| 国产成人在线一区| 川上优av中文字幕一区二区| 久久久精品国产亚洲| 国产小视频在线观看| 亚洲第一天堂av| 国产三级午夜理伦三级| 欧美最新大片在线看| 97人人澡人人爽人人模亚洲| 自拍偷拍国产亚洲| 欧美福利第一页| 99视频在线精品| 国产成人精品一区二区在线小狼| 美女国产一区二区| 精品少妇无遮挡毛片| 国产欧美日本| 丰满的少妇愉情hd高清果冻传媒| 99国产**精品****| 亚洲v国产v| 色综合综合网| 久久久久久99| 九九热播视频在线精品6| 99在线视频播放| 精品视频在线观看网站| 成人激情视频免费在线| 日本在线中文字幕一区二区三区| 日韩av电影国产| 忘忧草在线日韩www影院| 国内伊人久久久久久网站视频| 4438x成人网全国最大| 久久九九国产精品怡红院| 在线日本中文字幕| 伊人久久久久久久久久久久久| 欧美少妇另类| 亚洲午夜未删减在线观看| 嫩草精品影院| 国产亚洲欧美一区| 在线视频自拍| 日韩在线观看免费| 欧美三级黄网| 不卡av电影院| 日本动漫理论片在线观看网站 | 女厕盗摄一区二区三区| 97人人爽人人喊人人模波多| sm在线播放| 欧美亚洲另类视频| 在线手机中文字幕| 国产精品成人av性教育| 成人黄色免费网站| 成人a在线观看| 精品一区视频| 国产精品99久久久久久久| 久9re热视频这里只有精品| 国产专区一区二区| 九九久久成人| 亚洲人成网站在线播放2019| 亚洲欧美色图| 国产成人艳妇aa视频在线| 亚洲久久一区| 亚洲乱码国产一区三区| 久久99国产精品尤物| wwwxxx色| 91蝌蚪国产九色| 农村老熟妇乱子伦视频| 亚洲免费观看高清完整版在线观看熊| 欧美人妻精品一区二区免费看| 天天做天天摸天天爽国产一区| 亚洲国产成人无码av在线| 欧美日韩视频第一区| 国产黄色小视频在线观看| 日韩电影中文字幕在线观看| 91福利在线视频| 欧美激情视频网| 亚洲播播91| 99在线视频播放| 经典一区二区| 蜜桃网站在线观看| 久久久噜噜噜| 免费黄视频在线观看| 久久嫩草精品久久久精品| 99久久久免费精品| 精品露脸国产偷人在视频| 在线免费看av的网站| 亚洲成人网在线| 中文字幕在线视频区| 91精品国产91久久久久久| 日韩国产大片| 久久影视中文粉嫩av| 亚洲香蕉av| 国产精品亚洲二区在线观看| 国产精品一品二品| 四虎永久免费在线观看| 一区二区三区欧美激情| 少妇一级淫片日本| 亚洲国产91精品在线观看| 日本视频不卡| 日韩av片电影专区| 国产区精品视频在线观看豆花| 亚洲电影免费| 午夜在线一区| xfplay5566色资源网站| 亚洲少妇屁股交4| 亚洲 日本 欧美 中文幕| 欧美videossexotv100| 男人天堂久久久| 日韩av片永久免费网站| 欧美激情网址| 久久这里只有精品18| 久久超级碰视频| 欧美18—19性高清hd4k| 欧美日韩亚洲高清| 亚洲黄色a级片| 久久久精品欧美| 日韩美女在线| 性欧美大战久久久久久久免费观看| 中日韩男男gay无套| 国产香蕉精品视频| 亚洲精品乱码久久久久久日本蜜臀| 中文字幕 自拍偷拍| 国产亚洲欧洲黄色| 写真福利精品福利在线观看| 精品婷婷色一区二区三区蜜桃| 午夜视频一区| 少妇愉情理伦片bd| 亚洲激情一二三区| 国产欧美日韩综合精品一区二区三区 | 亚洲欧洲www| 亚洲无码久久久久久久| 尤物九九久久国产精品的分类| av综合电影网站| 久久国产精品久久精品国产| 日韩视频久久| 鲁大师私人影院在线观看| 偷拍亚洲欧洲综合| 香蕉视频免费在线看| 欧美中文在线观看国产| 特黄特色欧美大片| aa在线免费观看| 久久众筹精品私拍模特| 波多野结衣小视频| 日韩小视频在线观看| 91嫩草国产线观看亚洲一区二区 | 亚洲高清激情| 中文在线永久免费观看| 欧美性xxxxxxxxx| 手机看片福利在线观看| 国产成人精品电影| 精品一区二区三区在线 | 久久99国产精品一区| 国产精品一区二区在线观看网站 | 欧美激情91| yy1111111| 日本福利一区二区| 欧美三级黄网| 国产成人亚洲欧美| 午夜亚洲视频| 成人做爰69片免网站| 欧美精品久久一区二区三区| √天堂8在线网| 国产视频在线观看一区| 视频一区免费在线观看| 最新黄色av网址| 精品久久人人做人人爱| 亚洲天堂电影| 中文精品一区二区三区| 国产成人8x视频一区二区| 日韩黄色在线播放| 中文字幕亚洲综合久久| 日韩影片在线观看| 日本精品免费在线观看| 国产精品久久影院| 亚洲成熟女性毛茸茸| 奇米四色中文综合久久| 国产韩日影视精品| 中文字幕第九页| 欧美午夜精品理论片a级按摩| 午夜av在线免费观看 | 色欧美自拍视频| 中文字幕1区2区| 欧美在线免费播放| 日本大胆在线观看| 神马影院午夜我不卡| 国产a精品视频| 中国一区二区视频| 久久免费国产视频| 日韩三级在线| 国产精品无码一区二区三区免费| 欧美一区二区三区在线观看|