999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于schema可變技術的面向對象數據庫的設計與實現

2014-11-05 13:46:05李書攀
電子技術與軟件工程 2014年18期
關鍵詞:數據庫結構

李書攀

摘 要

面向對象數據庫為適應新的數據庫應用需要而產生的數據庫系統,它將面向對象的方法與數據庫技術融合在一起。本文針對在程序開發時,數據庫schema經常變動而導致原有存放在數據庫中的數據失效,頻繁將數據導入導出的問題,構建基于schema可變技術的面向對象數據庫,使得數據庫在schema變化的過程中,盡可能的保留數據庫中存儲的原有數據,減少數據庫中數據因schema變化而引起的數據丟失問題,提高面向對象數據庫的可用性。

【關鍵詞】schema可變 面向對象數據庫

面向對象對象數據庫是面向對象技術與數據庫技術的結合,構成新的數據庫領域研究和發展方向,使數據庫管理系統能夠全面的支持面向對象的模型,使數據庫中的數據接近于面向對象程序所定義的語義結構,實現面向對象程序與數據庫的無縫銜接,提高數據庫模擬和操縱客觀對象的能力。同時面向對象數據庫面臨著與其它數據庫相似的問題,如數據庫的可擴展性問題、數據庫性能提升問題等。

本文針對在開發設計數據庫時schema經常變動而導致原有存放在數據庫中的數據失效,頻繁將數據導入導出的問題,提出一種基于schema可變技術的面向對象數據庫,使得數據庫能夠在schema變動的情況下盡量保證能夠繼續使用以前的存儲的數據而不必重新導入數據,提高數據庫的可用性。

1 數據庫的概要設計

依據分層設計的思想是將每個模塊劃分為不同的層次。整個數據庫共分為三個層次,從上到下分別是接口層、數據操縱層、數據存儲層,結構如如圖1所示。

1.1 用戶接口層

該層是數據庫提供給用戶的接口,主要是用于規范客戶端程序如何訪問數據庫的應用接口,其提供了諸如查詢和更新數據庫中數據的方法。該層主要包含兩個部分:

(1)程序接口:增加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作是數據庫的最基本的操作,它們主要被用于描述軟件系統中持久層的基本操作,同時也是數據庫中最為常用的操作。

(2)管理接口:提供數據庫的基本方法,如刪除schema結構,查看數據庫表中數據內容等。

1.2 數據操縱層

該層主要負責對數據庫內的對象進行操縱,包括反射Java的類結構、類的schema的存儲、索引的維護以及創建等,主要分為以下幾個模塊:

(1)Reflector:反射(reflector)是Java語言提供的一種動態的獲取加載到JVM中的類的方法、屬性以及方法和屬性上的標注的技術。在schema可變技術的面向對象數據庫中,在很多的地方需要借助到Java語言的反射技術,如類結構的解析、schema的檢測、實例中數據的獲取等。

(2) ClassicMetadata:主要是用來存儲解析出來的類的結構,避免對已經解析過的類的結構再次進行解析,管理類的版本以及schema的演化。

(3)Index Query:主要是對索引進行管理。它的功能體現在以下幾個方面:①當需要創建索引時,根據創建索引的條件,創建索引;②當查詢條件使用到索引時,根據索引的特點以及查詢的方式,選擇一種最為適合此種查詢的索引操作;③當用戶插入的數據造成索引的更新時,更新和調整索引等;④對索引的狀態進行管理和監控。

1.3 數據存儲層

該層主要用于維護已經存儲在數據庫中的數據,包括類的存儲的組織方式,類的索引的結構等。主要分為以下幾個模塊:

(1)Class Index:由于在面向對象數據庫中每個類的實例都是用UUID標識的。根據UUID的重復率低、長度固定、數據結構為string類型的特點,構建索引全部類的實例的數據結構。

(2)Class Field index:由于在每個類中,可以依據每個類的屬性,為某個屬性建立索引,Classic Field index提供了索引,方便用戶快速查詢到需要的數據。

(3)ACID transection slot:ACID是指事務的原子性、一致性、獨立性及持久性,是數據庫必須具備的性質。ACID transection slot就是為了保證ACID在數據庫中的實現而設置的。同時它也提供了部分基本的數據結構,為數據的存儲提供了可能。

2 schema可變技術的實現

2.1 面向對象數據庫中的Schema可變技術

數據庫的Schema是對數據模型的實現。Schema表示了數據庫的結構或者是數據庫中的一個名字空間,包含了一組表結構、視圖、和存儲過程等對象。在面向對象數據庫中,數據庫的schema是通過類的結構來表示的,schema的變化可能會導致數據庫中存放的原有數據失效或丟失。

Schema可變技術即意味著當數據庫的類結構發生變化時,如果該類的部分數據以及數據的限定與上一個版本的類結構中存儲的數據以及數據限制兼容時,則上一個版本的類結構存儲的數據依然可以在當前的類結構當中使用,不必進行數據庫中數據的調整或者更新操作。再該面向對象數據庫中,通過建立的類結構與數據庫中存儲的數據做映射的方式實現schema可變技術,我們使用的映射方法為:將類的名稱與版本號相結合的方式——“原類名+版本號”為類命名。

數據庫支持schema可變技術可以帶來很多的優勢:

(1)盡可能的保留已經存儲在數據庫中的原始數據,使其在schema發生變動時,不丟失數據。

(2)在schema變動時,不必對數據庫進行調整或者更新的操作,簡化了數據庫管理員的工作。

2.2 面向對象數據庫中Schema變化的原因

Schema變化是由類結構的變化造成的,類結構變化的原因可分為以下幾種:endprint

2.2.1 由于類自身的變化而造成的

(1)增加屬性。

(2)減少屬性。

(3)改變屬性的類型。

(4)改變屬性的約束條件。

2.2.2 由于父類的變化而造成的

在面向對象語言中存在繼承關系,即子類繼承父類中的屬性,當該類父類的結構發生改變的時,子類的結構會同時發生改變。

2.3 Schema可變技術的主要流程

在Schema可變的面向對象數據庫中,實現schema可變技術的重要操作位主要有三個,分別是是Schema的解析,Schema發生變化后的處理以及如何將Schema中的數據添加到不同版本的類結構中。

2.3.1 Schema的解析流程

Schema的解析是指獲取指定類內部的屬性以及屬性的標識等信息的過程,解析完之后會將解析后的schema信息添加到數據庫中。其具體流程如下所示:

(1)將類名加入隊列中,并從隊列中取出一個類名進行解析,如果該類為object則放棄解析,如果不是object則轉到2。

(2)將該類的父類父類添加到隊列中。

(3)逐個解析該類的屬性。

a. 如果是基本類型,則解析其名稱以及約束。

b. 如果不是基本的類型,則解析器名稱以及約束,并將該類的名稱加入到隊列中。

(4)轉到1。

2.3.2 Schema變化后的對Schema處理

Schema變化后,數據庫能夠識別出該schema的變化,然后根據解析出來的類結構,生成新的版本信息,如果該類與數據庫中存儲的該類以前的版本信息兼容,則生成新的類結構和版本號,具體流程如下所示:

(1)檢測該類的結構是否存在,如果存在則不再進行類結構的演化并刪除該結構;如果不存在,則轉到(2)。

(2)根據兼容性列表(如表1所示),檢測該schema中保存的類的結構是否與其它的版本相沖突,如果不沖突,則存儲該類的結構,轉到(4);如果沖突,則給出沖突的原因、版本號等信息。

(3)根據已經存在的類的結構,生成新的版本號。

2.3.3 Schema變化后對類的處理

當程序進行查詢操作時,根據傳遞過來的客戶端的schema信息,查詢在服務器端是否已經存儲與該Scheme相應的版本,如果不存在,則返回空;如果存在,則依據查詢條件進行查詢,具體流程如下所示:

(1)從數據庫中獲取該類的所有數據,如果數據庫中所有的類都應解析完畢,則退出解析過程并返回結果;如果還有未解析的類,則取出一個,進行解析。

(2)根據數據庫中存儲的類中的屬性和類的版本信息,逐一解析數據庫中存儲的類的每個屬性,并將值填入查詢結果中。

a.在數據庫中的類不包含該類屬性時,如果該屬性允許此值為空,則將該屬性設置為null;如果該屬性不允許為空,則放棄對數據庫中類的解析,轉到1。

b. 類中同名屬性的類型發生改變,則放棄對數據庫中存儲的類的解析并轉到(1)。

c. 類中屬性的標示發生改變,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。

d. 如果數據庫中的類包含該類的屬性時,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。

(3)轉到1。

3 系統測試

3.1 面向對象數據的存取

3.1.1 構造POJO類結構

public class Person {

private String name;

private int age;

}

3.1.2將name設置為test,age設置為20,并將該類數據存入數據庫中。

3.1.3從數據庫中取出數據,name=test,age=20

由此可以說明,數據庫能夠完成對類結構的解析,并可以取出相應的數據。

3.2 在兼容的情況下schema變更測試

3.2.1更改后的Person類

public class Person {

private String name;

private int age;

private String description;

}

在這里增加一個屬性description,它為String類型的,默認的情況下,允許該字段為null,所以屬于能夠與前邊所存儲的類的實例相兼容。

3.2.2在服務器端輸入命令對版本進行查看,版本信息顯示如下內容

V1:Person:Name String,Person:Age Int

V2:Person:Name String,Person:Age Int,Person:description String

3.2.3讀取數據,讀取結果為:Name=test,Age=20,Description= 。

在這組測試中,可以得出該數據庫所提供的schema可變技術是正確的。

3.3 在不兼容情況下schema變更測試

3.3.1更改后的Person類

public class Person {

private String name;

private Age age;

}

在這里將原有的名稱為age的屬性由int修改為Age類。

3.3.2使用該類添加數據,則返回錯誤信息

“There is collision on Person:name, please recheck the schema. Collision version V1”

在這組測試中,可以得出該數據庫可能夠識別不兼容的schema,并提示有沖突的版本。

4 總結

基于schema可變技術的面向對象數據庫實現了schema可變技術,使得數據庫在schema變化的過程中,盡可能的保留數據庫中存儲的原有數據,減少數據庫中數據因schema變化而引起的數據丟失問題,提高面向對象數據庫的可用性。但是其也有部分不足的地方,如不能夠很好的支持泛型、對靜態變量不能夠做到有效的支持、不支持事務等。在以后的工作中,將根據面向對象數據庫的發展逐漸的完善該數據庫,使其融入新的技術融入更多的技術并且在已有的技術上進行創新。

參考文獻

[1]Object database[N/OL].2010.http://en.wikipedia.org/wiki/Object_database.

[2]埃史爾.Java編程思想(第四版)[M].北京:機械工業出版社,2007.

[3]王珊、薩師煊等.數據庫系統概論[M]. 北京:教育出版社,2006.

[4]Richardson.POJOs IN ACTION:Developing Enterprise Applications with Lightweight Frameworks[M]. Oreilly & Associates Inc,2007.

作者單位

南陽師范學院計算機與信息技術學院 河南省南陽市 473061endprint

2.2.1 由于類自身的變化而造成的

(1)增加屬性。

(2)減少屬性。

(3)改變屬性的類型。

(4)改變屬性的約束條件。

2.2.2 由于父類的變化而造成的

在面向對象語言中存在繼承關系,即子類繼承父類中的屬性,當該類父類的結構發生改變的時,子類的結構會同時發生改變。

2.3 Schema可變技術的主要流程

在Schema可變的面向對象數據庫中,實現schema可變技術的重要操作位主要有三個,分別是是Schema的解析,Schema發生變化后的處理以及如何將Schema中的數據添加到不同版本的類結構中。

2.3.1 Schema的解析流程

Schema的解析是指獲取指定類內部的屬性以及屬性的標識等信息的過程,解析完之后會將解析后的schema信息添加到數據庫中。其具體流程如下所示:

(1)將類名加入隊列中,并從隊列中取出一個類名進行解析,如果該類為object則放棄解析,如果不是object則轉到2。

(2)將該類的父類父類添加到隊列中。

(3)逐個解析該類的屬性。

a. 如果是基本類型,則解析其名稱以及約束。

b. 如果不是基本的類型,則解析器名稱以及約束,并將該類的名稱加入到隊列中。

(4)轉到1。

2.3.2 Schema變化后的對Schema處理

Schema變化后,數據庫能夠識別出該schema的變化,然后根據解析出來的類結構,生成新的版本信息,如果該類與數據庫中存儲的該類以前的版本信息兼容,則生成新的類結構和版本號,具體流程如下所示:

(1)檢測該類的結構是否存在,如果存在則不再進行類結構的演化并刪除該結構;如果不存在,則轉到(2)。

(2)根據兼容性列表(如表1所示),檢測該schema中保存的類的結構是否與其它的版本相沖突,如果不沖突,則存儲該類的結構,轉到(4);如果沖突,則給出沖突的原因、版本號等信息。

(3)根據已經存在的類的結構,生成新的版本號。

2.3.3 Schema變化后對類的處理

當程序進行查詢操作時,根據傳遞過來的客戶端的schema信息,查詢在服務器端是否已經存儲與該Scheme相應的版本,如果不存在,則返回空;如果存在,則依據查詢條件進行查詢,具體流程如下所示:

(1)從數據庫中獲取該類的所有數據,如果數據庫中所有的類都應解析完畢,則退出解析過程并返回結果;如果還有未解析的類,則取出一個,進行解析。

(2)根據數據庫中存儲的類中的屬性和類的版本信息,逐一解析數據庫中存儲的類的每個屬性,并將值填入查詢結果中。

a.在數據庫中的類不包含該類屬性時,如果該屬性允許此值為空,則將該屬性設置為null;如果該屬性不允許為空,則放棄對數據庫中類的解析,轉到1。

b. 類中同名屬性的類型發生改變,則放棄對數據庫中存儲的類的解析并轉到(1)。

c. 類中屬性的標示發生改變,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。

d. 如果數據庫中的類包含該類的屬性時,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。

(3)轉到1。

3 系統測試

3.1 面向對象數據的存取

3.1.1 構造POJO類結構

public class Person {

private String name;

private int age;

}

3.1.2將name設置為test,age設置為20,并將該類數據存入數據庫中。

3.1.3從數據庫中取出數據,name=test,age=20

由此可以說明,數據庫能夠完成對類結構的解析,并可以取出相應的數據。

3.2 在兼容的情況下schema變更測試

3.2.1更改后的Person類

public class Person {

private String name;

private int age;

private String description;

}

在這里增加一個屬性description,它為String類型的,默認的情況下,允許該字段為null,所以屬于能夠與前邊所存儲的類的實例相兼容。

3.2.2在服務器端輸入命令對版本進行查看,版本信息顯示如下內容

V1:Person:Name String,Person:Age Int

V2:Person:Name String,Person:Age Int,Person:description String

3.2.3讀取數據,讀取結果為:Name=test,Age=20,Description= 。

在這組測試中,可以得出該數據庫所提供的schema可變技術是正確的。

3.3 在不兼容情況下schema變更測試

3.3.1更改后的Person類

public class Person {

private String name;

private Age age;

}

在這里將原有的名稱為age的屬性由int修改為Age類。

3.3.2使用該類添加數據,則返回錯誤信息

“There is collision on Person:name, please recheck the schema. Collision version V1”

在這組測試中,可以得出該數據庫可能夠識別不兼容的schema,并提示有沖突的版本。

4 總結

基于schema可變技術的面向對象數據庫實現了schema可變技術,使得數據庫在schema變化的過程中,盡可能的保留數據庫中存儲的原有數據,減少數據庫中數據因schema變化而引起的數據丟失問題,提高面向對象數據庫的可用性。但是其也有部分不足的地方,如不能夠很好的支持泛型、對靜態變量不能夠做到有效的支持、不支持事務等。在以后的工作中,將根據面向對象數據庫的發展逐漸的完善該數據庫,使其融入新的技術融入更多的技術并且在已有的技術上進行創新。

參考文獻

[1]Object database[N/OL].2010.http://en.wikipedia.org/wiki/Object_database.

[2]埃史爾.Java編程思想(第四版)[M].北京:機械工業出版社,2007.

[3]王珊、薩師煊等.數據庫系統概論[M]. 北京:教育出版社,2006.

[4]Richardson.POJOs IN ACTION:Developing Enterprise Applications with Lightweight Frameworks[M]. Oreilly & Associates Inc,2007.

作者單位

南陽師范學院計算機與信息技術學院 河南省南陽市 473061endprint

2.2.1 由于類自身的變化而造成的

(1)增加屬性。

(2)減少屬性。

(3)改變屬性的類型。

(4)改變屬性的約束條件。

2.2.2 由于父類的變化而造成的

在面向對象語言中存在繼承關系,即子類繼承父類中的屬性,當該類父類的結構發生改變的時,子類的結構會同時發生改變。

2.3 Schema可變技術的主要流程

在Schema可變的面向對象數據庫中,實現schema可變技術的重要操作位主要有三個,分別是是Schema的解析,Schema發生變化后的處理以及如何將Schema中的數據添加到不同版本的類結構中。

2.3.1 Schema的解析流程

Schema的解析是指獲取指定類內部的屬性以及屬性的標識等信息的過程,解析完之后會將解析后的schema信息添加到數據庫中。其具體流程如下所示:

(1)將類名加入隊列中,并從隊列中取出一個類名進行解析,如果該類為object則放棄解析,如果不是object則轉到2。

(2)將該類的父類父類添加到隊列中。

(3)逐個解析該類的屬性。

a. 如果是基本類型,則解析其名稱以及約束。

b. 如果不是基本的類型,則解析器名稱以及約束,并將該類的名稱加入到隊列中。

(4)轉到1。

2.3.2 Schema變化后的對Schema處理

Schema變化后,數據庫能夠識別出該schema的變化,然后根據解析出來的類結構,生成新的版本信息,如果該類與數據庫中存儲的該類以前的版本信息兼容,則生成新的類結構和版本號,具體流程如下所示:

(1)檢測該類的結構是否存在,如果存在則不再進行類結構的演化并刪除該結構;如果不存在,則轉到(2)。

(2)根據兼容性列表(如表1所示),檢測該schema中保存的類的結構是否與其它的版本相沖突,如果不沖突,則存儲該類的結構,轉到(4);如果沖突,則給出沖突的原因、版本號等信息。

(3)根據已經存在的類的結構,生成新的版本號。

2.3.3 Schema變化后對類的處理

當程序進行查詢操作時,根據傳遞過來的客戶端的schema信息,查詢在服務器端是否已經存儲與該Scheme相應的版本,如果不存在,則返回空;如果存在,則依據查詢條件進行查詢,具體流程如下所示:

(1)從數據庫中獲取該類的所有數據,如果數據庫中所有的類都應解析完畢,則退出解析過程并返回結果;如果還有未解析的類,則取出一個,進行解析。

(2)根據數據庫中存儲的類中的屬性和類的版本信息,逐一解析數據庫中存儲的類的每個屬性,并將值填入查詢結果中。

a.在數據庫中的類不包含該類屬性時,如果該屬性允許此值為空,則將該屬性設置為null;如果該屬性不允許為空,則放棄對數據庫中類的解析,轉到1。

b. 類中同名屬性的類型發生改變,則放棄對數據庫中存儲的類的解析并轉到(1)。

c. 類中屬性的標示發生改變,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。

d. 如果數據庫中的類包含該類的屬性時,如果兼容則繼續解析,如果不兼容,則放棄對數據庫中存儲的類的解析并轉到1。

(3)轉到1。

3 系統測試

3.1 面向對象數據的存取

3.1.1 構造POJO類結構

public class Person {

private String name;

private int age;

}

3.1.2將name設置為test,age設置為20,并將該類數據存入數據庫中。

3.1.3從數據庫中取出數據,name=test,age=20

由此可以說明,數據庫能夠完成對類結構的解析,并可以取出相應的數據。

3.2 在兼容的情況下schema變更測試

3.2.1更改后的Person類

public class Person {

private String name;

private int age;

private String description;

}

在這里增加一個屬性description,它為String類型的,默認的情況下,允許該字段為null,所以屬于能夠與前邊所存儲的類的實例相兼容。

3.2.2在服務器端輸入命令對版本進行查看,版本信息顯示如下內容

V1:Person:Name String,Person:Age Int

V2:Person:Name String,Person:Age Int,Person:description String

3.2.3讀取數據,讀取結果為:Name=test,Age=20,Description= 。

在這組測試中,可以得出該數據庫所提供的schema可變技術是正確的。

3.3 在不兼容情況下schema變更測試

3.3.1更改后的Person類

public class Person {

private String name;

private Age age;

}

在這里將原有的名稱為age的屬性由int修改為Age類。

3.3.2使用該類添加數據,則返回錯誤信息

“There is collision on Person:name, please recheck the schema. Collision version V1”

在這組測試中,可以得出該數據庫可能夠識別不兼容的schema,并提示有沖突的版本。

4 總結

基于schema可變技術的面向對象數據庫實現了schema可變技術,使得數據庫在schema變化的過程中,盡可能的保留數據庫中存儲的原有數據,減少數據庫中數據因schema變化而引起的數據丟失問題,提高面向對象數據庫的可用性。但是其也有部分不足的地方,如不能夠很好的支持泛型、對靜態變量不能夠做到有效的支持、不支持事務等。在以后的工作中,將根據面向對象數據庫的發展逐漸的完善該數據庫,使其融入新的技術融入更多的技術并且在已有的技術上進行創新。

參考文獻

[1]Object database[N/OL].2010.http://en.wikipedia.org/wiki/Object_database.

[2]埃史爾.Java編程思想(第四版)[M].北京:機械工業出版社,2007.

[3]王珊、薩師煊等.數據庫系統概論[M]. 北京:教育出版社,2006.

[4]Richardson.POJOs IN ACTION:Developing Enterprise Applications with Lightweight Frameworks[M]. Oreilly & Associates Inc,2007.

作者單位

南陽師范學院計算機與信息技術學院 河南省南陽市 473061endprint

猜你喜歡
數據庫結構
《形而上學》△卷的結構和位置
哲學評論(2021年2期)2021-08-22 01:53:34
論結構
中華詩詞(2019年7期)2019-11-25 01:43:04
新型平衡塊結構的應用
模具制造(2019年3期)2019-06-06 02:10:54
數據庫
財經(2017年15期)2017-07-03 22:40:49
數據庫
財經(2017年2期)2017-03-10 14:35:35
論《日出》的結構
數據庫
財經(2016年15期)2016-06-03 07:38:02
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
創新治理結構促進中小企業持續成長
現代企業(2015年9期)2015-02-28 18:56:50
主站蜘蛛池模板: 97综合久久| 欧美日韩精品一区二区在线线 | 欧美一区二区啪啪| 一级爆乳无码av| 国产午夜无码片在线观看网站| 久久精品国产91久久综合麻豆自制| 成人看片欧美一区二区| 欧美区一区二区三| 国产精品爆乳99久久| 欧美亚洲欧美| 欧美区一区| 国产真实乱子伦视频播放| 欧美乱妇高清无乱码免费| 欧美一区二区人人喊爽| 丰满少妇αⅴ无码区| 91午夜福利在线观看精品| 日本在线国产| 欧美在线精品怡红院 | 久久精品日日躁夜夜躁欧美| 国产成人精品视频一区二区电影| 国产亚洲高清在线精品99| 久久综合色播五月男人的天堂| 伊人久综合| 久久亚洲黄色视频| 欧美中文字幕一区| 欧美黄网站免费观看| 欧美精品导航| 国产v精品成人免费视频71pao| 91美女视频在线| 91小视频在线观看免费版高清| 大陆精大陆国产国语精品1024| 丝袜高跟美脚国产1区| 色窝窝免费一区二区三区| 成年人国产视频| 国产香蕉在线| 国产最新无码专区在线| 国产精品第一区在线观看| 国产一区二区三区日韩精品| 91亚洲视频下载| 亚洲午夜片| 国产91九色在线播放| 一级毛片视频免费| 国产女人水多毛片18| 亚洲精品图区| 狠狠ⅴ日韩v欧美v天堂| 国产高清在线观看91精品| 日韩无码视频网站| 亚洲综合天堂网| 久久狠狠色噜噜狠狠狠狠97视色| 亚洲天堂精品在线观看| 久久久久免费精品国产| 91欧美在线| 亚洲一区二区视频在线观看| 91精品aⅴ无码中文字字幕蜜桃| 五月天在线网站| 亚洲无线视频| 欧美三級片黃色三級片黃色1| 日本a∨在线观看| 日韩精品一区二区三区免费在线观看| 亚洲swag精品自拍一区| 国产成人精品视频一区二区电影 | 国产真实乱人视频| 一级看片免费视频| 国产精品永久久久久| 国产无码精品在线播放| 综合天天色| 国产一区二区三区在线精品专区 | 午夜视频www| 欧美激情视频一区| 99尹人香蕉国产免费天天拍| 亚洲精品制服丝袜二区| 久操中文在线| 国产精品亚洲αv天堂无码| 最新亚洲人成无码网站欣赏网 | 99re热精品视频中文字幕不卡| 一级一级一片免费| 深夜福利视频一区二区| 亚洲精品国产乱码不卡| 婷婷五月在线| 99这里精品| 国产粉嫩粉嫩的18在线播放91| 人人爽人人爽人人片|