├── Airbnb.pdf ├── README.md ├── createTables.sql ├── getMinBedroomNum.sql ├── getSurroundingProperties.sql ├── updateBedroomCount.sql └── updatePropertyRating.sql /Airbnb.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raisaat/Airbnb-Database/47fbc1f6eda40eab04541f791eaa02f0829a2636/Airbnb.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Airbnb-Database 2 | 3 | Reverse-engineered the database of the vacation rental application, [Airbnb](https://www.airbnb.com/), which is an online vacation rental marketplace. 4 | 5 | * Designed the EER diagram for the database, converted it to a relational schema and normalized it to 3NF 6 | * Created tables, stored procedures and triggers in SQL from the design 7 | 8 | **NOTE:** This project does not comprehensively cover all aspects of the application. 9 | 10 | *Refer to "Airbnb.pdf" for more details* 11 | -------------------------------------------------------------------------------- /createTables.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE ReviewForProperty; 2 | CREATE TABLE ReviewForProperty( 3 | GuestID INT, 4 | PID INT , 5 | Created_Time Date NOT NULL, 6 | Modified_Time Date, 7 | CommentInReview VARCHAR(1000) , 8 | Cleanliness_Rating NUMBER(2,1), 9 | Communication_Rating NUMBER(2,1), 10 | CheckIn_Rating NUMBER(2,1), 11 | Accuracy_Rating NUMBER(2,1), 12 | Location_Rating NUMBER(2,1), 13 | Value_Rating NUMBER(2,1), 14 | Overall_Rating NUMBER(2,1), 15 | PRIMARY KEY(GuestID,PID)); 16 | 17 | DROP TABLE PhotoForPropertyReview; 18 | CREATE TABLE PhotoForPropertyReview( 19 | GuestID INT , 20 | PID INT , 21 | PhotoName VARCHAR(50) , 22 | ImageFile BLOB NOT NULL, 23 | PRIMARY KEY(GuestID,PID,PhotoName)); 24 | 25 | DROP TABLE PropertyIncludedInWishlist; 26 | CREATE TABLE PropertyIncludedInWishlist( 27 | PID INT , 28 | AirBnBUID INT , 29 | WishlistName VARCHAR(50) , 30 | CheckInDate DATE, 31 | CheckOutDate DATE, 32 | PRIMARY KEY(PID,AirBnBUID,WishlistName)); 33 | 34 | DROP TABLE WishList; 35 | CREATE TABLE WishList( 36 | AirBnBUID INT , 37 | WishlistName VARCHAR(50) NOT NULL UNIQUE, 38 | Privacy CHAR(1), 39 | PRIMARY KEY(AirBnBUID,WishlistName)); 40 | 41 | DROP TABLE ReviewForUsers; 42 | CREATE TABLE ReviewForUsers( 43 | HostUID INT , 44 | GuestUID INT , 45 | GuestRating NUMBER(2,1), 46 | HostRating NUMBER(2,1), 47 | CommentForHost VARCHAR(1000), 48 | CommentForGuest VARCHAR(1000), 49 | ReviewForHostCreated DATE, 50 | ReviewForGuestCreated DATE, 51 | ReviewForHostModified DATE, 52 | ReviewForGuestModified DATE, 53 | PRIMARY KEY(HostUID,GuestUID)); 54 | 55 | DROP TABLE CreditCard; 56 | CREATE TABLE CreditCard( 57 | CardNum INT , 58 | CSV INT NOT NULL, 59 | ExpirationDate DATE NOT NULL, 60 | CardholderName VARCHAR(50) NOT NULL, 61 | CardType CHAR(6) NOT NULL, 62 | Address VARCHAR(100), 63 | PRIMARY KEY(CardNum)); 64 | 65 | DROP TABLE BankAccount; 66 | CREATE TABLE BankAccount( 67 | AccountNUMBER INT , 68 | RoutingNum INT NOT NULL, 69 | AccountType VARCHAR(20) NOT NULL, 70 | PRIMARY KEY(AccountNUMBER)); 71 | 72 | DROP TABLE Promo; 73 | CREATE TABLE Promo( 74 | Code VARCHAR(10), 75 | Discount_Amt NUMBER NOT NULL, 76 | PRIMARY KEY(Code)); 77 | 78 | DROP TABLE Message; 79 | CREATE TABLE Message( 80 | HostUID INT , 81 | GuestID INT , 82 | Created DATE NOT NULL, 83 | Message_To INT NOT NULL, 84 | Message_From INT NOT NULL, 85 | Body VARCHAR(1000), 86 | PRIMARY KEY(HostUID,GuestID)); 87 | 88 | DROP TABLE Guest; 89 | CREATE TABLE Guest( 90 | AirBnBUID INT , 91 | AvgRating NUMBER(2,1) , 92 | NumOfRatings INT DEFAULT 0, 93 | CreditCardNum INT NOT NULL UNIQUE, 94 | PRIMARY KEY(AirBnBUID)); 95 | 96 | DROP TABLE Host; 97 | CREATE TABLE Host( 98 | AirBnBUID INT , 99 | IsSuperHost CHAR(1) , 100 | AvgRating NUMBER(2,1), 101 | NumOfRatings INT, 102 | BankAccountNumber INT NOT NULL UNIQUE, 103 | PRIMARY KEY(AirBnBUID)); 104 | 105 | DROP TABLE AirBnBUser; 106 | CREATE TABLE AirBnBUser( 107 | AirBnBUID INT, 108 | DOB DATE, 109 | Email VARCHAR(20) NOT NULL, 110 | UserPassword VARCHAR(20) NOT NULL, 111 | Gender CHAR(1), 112 | About VARCHAR(100), 113 | Phone VARCHAR(15) NOT NULL, 114 | ProfilePhotoName VARCHAR(20), 115 | ProfilePhoto BLOB, 116 | Address VARCHAR(100), 117 | Fname VARCHAR(20) NOT NULL, 118 | MInitial VARCHAR(20), 119 | LName VARCHAR(20), 120 | Created TIMESTAMP, 121 | LoginCnt INT, 122 | LastLogin TIMESTAMP, 123 | EmName VARCHAR(20), 124 | EmRelationship VARCHAR(20), 125 | EmPreferredLang VARCHAR(15), 126 | EmEmail VARCHAR(20) NOT NULL, 127 | EmCountryCode VARCHAR(3) NOT NULL, 128 | EmPhone VARCHAR(15) NOT NULL, 129 | PRIMARY KEY(AirBnBUID)); 130 | 131 | DROP TABLE Amenity; 132 | CREATE TABLE Amenity( 133 | PID INT , 134 | AmenityName VARCHAR(20), 135 | PRIMARY KEY(PID,AmenityName)); 136 | 137 | DROP TABLE PropertyPhoto; 138 | CREATE TABLE PropertyPhoto( 139 | PID INT , 140 | PropertyName VARCHAR(20), 141 | ImageFile BLOB NOT NULL, 142 | PRIMARY KEY(PID,PropertyName)); 143 | 144 | DROP TABLE HouseRule; 145 | CREATE TABLE HouseRule( 146 | PID INT , 147 | RuleName VARCHAR(20), 148 | PRIMARY KEY(PID,RuleName)); 149 | 150 | DROP TABLE AvailableBookingSlot; 151 | CREATE TABLE AvailableBookingSlot( 152 | PID INT , 153 | StartDate DATE, 154 | EndDate DATE, 155 | PRIMARY KEY(PID,StartDate,EndDate)); 156 | 157 | DROP TABLE Bedroom; 158 | CREATE TABLE Bedroom( 159 | PropertyID INT , 160 | BedroomNumber VARCHAR(5), 161 | BedType VARCHAR(10), 162 | BedCnt INT, 163 | PRIMARY KEY(PropertyID,BedroomNumber,BedType,BedCnt)); 164 | 165 | DROP TABLE Category; 166 | CREATE TABLE Category( 167 | PID INT , 168 | categoryName VARCHAR(20), 169 | PRIMARY KEY(PID,categoryName)); 170 | 171 | DROP TABLE PropertyListing; 172 | CREATE TABLE PropertyListing( 173 | PID INT , 174 | PropertyName VARCHAR(50) , 175 | Zipcode INT NOT NULL, 176 | BathroomCnt INT, 177 | BedroomCnt INT DEFAULT 0, 178 | GuestNum INT, 179 | PricePerNight NUMBER(6,2), 180 | CleaningFee NUMBER(4,2), 181 | Created Date, 182 | CheckInTime TIMESTAMP, 183 | CheckOutTime TIMESTAMP, 184 | IsRefundable CHAR(1), 185 | CancellationPeriod INT, 186 | CancellationType VARCHAR(10), 187 | RefundRate NUMBER(2,1), 188 | NumOfRatings INT DEFAULT 0, 189 | AvgRatings NUMBER(2,1) DEFAULT 0, 190 | HID INT, 191 | Street VARCHAR(20), 192 | City VARCHAR(20), 193 | StateofResidence VARCHAR(20), 194 | Country VARCHAR(20), 195 | TaxRate NUMBER(2,1), 196 | PRIMARY KEY(PID)); 197 | 198 | DROP TABLE Booking; 199 | CREATE TABLE Booking( 200 | BID INT, 201 | CheckInDate DATE NOT NULL, 202 | CheckOutDate DATE NOT NULL, 203 | AmountPaid NUMBER(6,2), 204 | BookingDate DATE NOT NULL, 205 | ModifiedDate DATE, 206 | SeniorGuestNum INT DEFAULT 0, 207 | AdultGuestNum INT DEFAULT 0, 208 | ChildGuestNum INT DEFAULT 0, 209 | IsCancelled CHAR(1), 210 | RefundPaid CHAR(1), 211 | CancelDate DATE, 212 | PromoCode VARCHAR(10), 213 | GuestUID INT, 214 | PID INT, 215 | TotalPrice NUMBER(6,2), 216 | Tax NUMBER(4,2), 217 | TotalPriceWTax NUMBER(6,2), 218 | AmountDue NUMBER(4,2), 219 | RefundAmt NUMBER(4,2), 220 | PRIMARY KEY(BID)); 221 | 222 | ALTER TABLE Guest ADD CONSTRAINT GuestFK_1 FOREIGN KEY(AirBnBUID) REFERENCES AirBnBUser(AirBnBUID) ON DELETE CASCADE; 223 | ALTER TABLE Guest ADD CONSTRAINT GuestFK_2 FOREIGN KEY(Creditcardnum) REFERENCES CREDITCARD(CARDNUM) ON DELETE CASCADE; 224 | ALTER TABLE Host ADD CONSTRAINT HostFK_1 FOREIGN KEY(AirBnBUID) REFERENCES AirBnBUser(AirBnBUID) ON DELETE CASCADE ; 225 | ALTER TABLE Host ADD CONSTRAINT HostFK_2 FOREIGN KEY(BANKACCOUNTNUMBER) REFERENCES BANKACCOUNT(ACCOUNTNUMBER) ON DELETE CASCADE ; 226 | ALTER TABLE ReviewForProperty ADD CONSTRAINT ReviewForPropertyFK_1 FOREIGN KEY(GuestID) REFERENCES Guest(AirBnBUID) ON DELETE CASCADE ; 227 | ALTER TABLE ReviewForProperty ADD CONSTRAINT ReviewForPropertyFK_2 FOREIGN KEY(PID) REFERENCES PropertyListing(PID) ON DELETE CASCADE ; 228 | ALTER TABLE PhotoForPropertyReview ADD CONSTRAINT PhotoForPropertyReviewFK_1 FOREIGN KEY(GuestID) REFERENCES Guest(AirBnBUID) ON DELETE CASCADE ; 229 | ALTER TABLE PhotoForPropertyReview ADD CONSTRAINT PhotoForPropertyReviewFK_2 FOREIGN KEY(PID) REFERENCES PropertyListing(PID) ON DELETE CASCADE ; 230 | ALTER TABLE PropertyIncludedInWishlist ADD CONSTRAINT PropertyIncludedInWishlistFK_1 FOREIGN KEY(AirBnBUID) REFERENCES Guest(AirBnBUID) ON DELETE CASCADE ; 231 | ALTER TABLE PropertyIncludedInWishlist ADD CONSTRAINT PropertyIncludedInWishlistFK_2 FOREIGN KEY(PID) REFERENCES PropertyListing(PID) ON DELETE CASCADE ; 232 | ALTER TABLE PropertyIncludedInWishlist ADD CONSTRAINT PropertyIncludedInWishlistFK_3 FOREIGN KEY(WishlistName) REFERENCES WishList(WishlistName) ON DELETE CASCADE; 233 | ALTER TABLE WishList ADD CONSTRAINT WishListFK_1 FOREIGN KEY(AirBnBUID) REFERENCES Guest(AirBnBUID) ON DELETE CASCADE; 234 | ALTER TABLE ReviewForUsers ADD CONSTRAINT ReviewForUsersFK_1 FOREIGN KEY(HostUID) REFERENCES Host(AirBnBUID) ON DELETE CASCADE ; 235 | ALTER TABLE ReviewForUsers ADD CONSTRAINT ReviewForUsersFK_2 FOREIGN KEY(GuestUID) REFERENCES Guest(AirBnBUID) ON DELETE CASCADE ; 236 | ALTER TABLE Message ADD CONSTRAINT MessageFK_1 FOREIGN KEY(HostUID) REFERENCES Host(AirBnBUID) ON DELETE CASCADE ; 237 | ALTER TABLE Message ADD CONSTRAINT MessageFK_2 FOREIGN KEY(GuestID) REFERENCES Guest(AirBnBUID) ON DELETE CASCADE ; 238 | ALTER TABLE Amenity ADD CONSTRAINT AmenityFK_1 FOREIGN KEY(PID) REFERENCES PropertyListing(PID) ON DELETE CASCADE ; 239 | ALTER TABLE PropertyPhoto ADD CONSTRAINT PropertyPhotoFK_1 FOREIGN KEY(PID) REFERENCES PropertyListing(PID) ON DELETE CASCADE ; 240 | ALTER TABLE HouseRule ADD CONSTRAINT HouseRuleFK_1 FOREIGN KEY(PID) REFERENCES PropertyListing(PID) ON DELETE CASCADE ; 241 | ALTER TABLE AvailableBookingSlot ADD CONSTRAINT AvailableBookingSlotFK_1 FOREIGN KEY(PID) REFERENCES PropertyListing(PID) ON DELETE CASCADE ; 242 | ALTER TABLE Bedroom ADD CONSTRAINT BedroomFK_1 FOREIGN KEY(PropertyID) REFERENCES PropertyListing(PID) ON DELETE CASCADE ; 243 | ALTER TABLE Category ADD CONSTRAINT CategoryFK_1 FOREIGN KEY(PID) REFERENCES PropertyListing(PID) ON DELETE CASCADE ; 244 | ALTER TABLE PROPERTYLISTING ADD CONSTRAINT propertyFK_1 FOREIGN KEY(HID) REFERENCES Host(AIRBNBUID) ON DELETE CASCADE ; 245 | ALTER TABLE Booking ADD CONSTRAINT BookingFK_1 FOREIGN KEY(GuestUID) REFERENCES Guest(AirBnBUID) ON DELETE CASCADE ; 246 | ALTER TABLE Booking ADD CONSTRAINT BookingFK_2 FOREIGN KEY(PID) REFERENCES PropertyListing(PID) ON DELETE CASCADE ; 247 | ALTER TABLE Booking ADD CONSTRAINT BookingFK_3 FOREIGN KEY(PROMOCODE) REFERENCES Promo(Code) ON DELETE CASCADE ; -------------------------------------------------------------------------------- /getMinBedroomNum.sql: -------------------------------------------------------------------------------- 1 | SET SERVEROUTPUT ON; 2 | create or replace 3 | PROCEDURE GetMinimumBedroomNumber(bedCnt IN INT) AS beds INT; 4 | 5 | recordproperty PROPERTYLISTING%rowtype; 6 | propId INT; 7 | propName varchar(20); 8 | 9 | CURSOR properties IS 10 | SELECT PID, PROPERTYNAME 11 | FROM PROPERTYLISTING 12 | WHERE BEDROOMCNT >= bedCnt; 13 | 14 | BEGIN 15 | 16 | open properties; 17 | LOOP 18 | FETCH properties INTO propId, propName; 19 | EXIT WHEN properties%NOTFOUND; 20 | dbms_output.put_line(propId||propName); 21 | end loop; 22 | close properties; 23 | END; -------------------------------------------------------------------------------- /getSurroundingProperties.sql: -------------------------------------------------------------------------------- 1 | CREATE OR REPLACE PROCEDURE GetSurroundingProperties(PropertyID IN INT) IS 2 | 3 | zip INT; 4 | recordproperty PROPERTYLISTING%rowtype; 5 | propid INT; 6 | propname varchar(20); 7 | CURSOR cprop IS 8 | SELECT PID,PROPERTYNAME 9 | FROM PROPERTYLISTING 10 | WHERE ZIPCODE =zip; 11 | BEGIN 12 | SELECT ZIPCODE into zip FROM PROPERTYLISTING WHERE PID=PropertyID; 13 | open cprop; 14 | LOOP 15 | FETCH cprop INTO propid,propname; 16 | EXIT WHEN cprop%NOTFOUND; 17 | dbms_output.put_line(propid||propname); 18 | end loop; 19 | close cprop; 20 | END; 21 | 22 | set serveroutput on size 30000; 23 | exec GetSurroundingProperties(1); -------------------------------------------------------------------------------- /updateBedroomCount.sql: -------------------------------------------------------------------------------- 1 | create or replace TRIGGER Update_Bedroom_Count 2 | AFTER INSERT ON Bedroom 3 | FOR EACH ROW 4 | BEGIN 5 | UPDATE PropertyListing 6 | SET BedroomCnt = BedroomCnt + 1 7 | WHERE PID = :new.PropertyID; 8 | END; -------------------------------------------------------------------------------- /updatePropertyRating.sql: -------------------------------------------------------------------------------- 1 | create or replace TRIGGER Update_Property_Rating 2 | AFTER INSERT ON ReviewForProperty 3 | FOR EACH ROW 4 | BEGIN 5 | UPDATE PropertyListing 6 | SET AvgRatings = (AvgRatings * NumOfRatings + :new.Overall_Rating)/(NumOfRatings + 1) 7 | WHERE PID = :new.PID; 8 | UPDATE PropertyListing 9 | SET NumOfRatings = NumOfRatings + 1 10 | WHERE PID = :new.PID; 11 | END; --------------------------------------------------------------------------------