{"id":20050044,"url":"https://github.com/memirdogan/onlineshoppingdb","last_synced_at":"2025-07-24T16:09:28.480Z","repository":{"id":217925080,"uuid":"745135558","full_name":"Memirdogan/OnlineShoppingDB","owner":"Memirdogan","description":"Explore the Data Visionaries SQL Bootcamp repository featuring a backup file of an e-commerce website database. Designed with a focus on database normalization and relational modeling, it includes essential tables like products, categories, users, and orders, along with additional interconnected tables enhancing the overall structure.","archived":false,"fork":false,"pushed_at":"2024-02-18T18:38:50.000Z","size":4475,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-12T20:47:16.250Z","etag":null,"topics":["database","eticaret","eticaret-database","onlineshopping","ornek-proje"],"latest_commit_sha":null,"homepage":"https://certificates.techcareer.net/tr/verify/21702118246225","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Memirdogan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-01-18T17:57:52.000Z","updated_at":"2024-07-02T12:02:01.000Z","dependencies_parsed_at":"2024-02-12T11:57:41.235Z","dependency_job_id":null,"html_url":"https://github.com/Memirdogan/OnlineShoppingDB","commit_stats":null,"previous_names":["memirdogan/sqlbootcamponlineshoppingdb","memirdogan/onlineshoppingdb"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Memirdogan%2FOnlineShoppingDB","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Memirdogan%2FOnlineShoppingDB/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Memirdogan%2FOnlineShoppingDB/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Memirdogan%2FOnlineShoppingDB/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Memirdogan","download_url":"https://codeload.github.com/Memirdogan/OnlineShoppingDB/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241480976,"owners_count":19969773,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","eticaret","eticaret-database","onlineshopping","ornek-proje"],"created_at":"2024-11-13T11:53:51.709Z","updated_at":"2025-03-02T08:27:37.079Z","avatar_url":"https://github.com/Memirdogan.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# SQL Online Shopping Project\n\nE-ticaret sitemin veritabanı tasarımı normalizasyonu göz önünde bulundurularak\nhazırlandı ve ilişkisel bir veritabanına dönüştürüldü. Öncelikle belirtilen ürünler,\nkategoriler, kullanıcılar ve siparişler tablolarıyla sınırlı kalmayarak, fazladan tablolar\nekledim ve bunları birbirleriyle ilişkilendirdim. Final haftasında ve zaman kısıtlamaları\nnedeniyle tablo sayısını çok fazla artıramamış olsam da, tasarımı daha çeşitli ve etkili\nhale getirmek isterdim.\nBaşlangıcımın ilk adımı, Excel üzerinde tabloları tasarlamak ve birbirleriyle\nilişkilendirmek oldu. Bunu yapmamın sebebi, verileri ve tabloları görselleştirebilirsem,\nsunumunun hem daha etkili olacağını hem de üzerinde çalışmamın daha rahat ve\nanlaşılır olacağını düşünmemdi. Tasarlarken renkler ile kolonların ilişkilerini belirttim.\nAşağıda Excel üzerinde yaptığım görselleştirmeyi paylaşıyorum:\n\n![image](https://github.com/Memirdogan/OnlineShoppingDB/assets/66549233/3210cfd3-3602-400b-84e9-7e0c8a38f2f5)\n\nTaslakları hazırladıktan sonra sıra tabloları oluşturmaya geldi. Tüm kodları tek tek\nyazarak belgeyi uzun bir hale getirmek istemediğimden aşağıda örnek bir kod\nbırakıyorum:\n\n```\nCREATE TABLE Siparisler (\n SiparisID UNIQUEIDENTIFIER PRIMARY KEY,\n UserID INT FOREIGN KEY REFERENCES Kullanıcılar(UserID),\n UrunID INT FOREIGN KEY REFERENCES Urunler(UrunID),\n OdemeID INT FOREIGN KEY REFERENCES OdemeTuru(OdemeID),\n SiparisTarihi DATE\n);\n```\n\nTabloları oluşturduktan sonra verileri girmeden önce birkaç tetikleyici (trigger) eklemek\nistedim. Bu tetikleyicilerin veritabanımda otomasyon sağlamasını amaçladım. Eklediğim\ntriggerlardan birkaçının amacı, veri girişi sırasında olası hatalardan biri olan tarih girişini\notomatize etmekti. Öncelikle, kullanıcılar tabloma kullanıcı kaydı girdiğimde, kullanıcının\nkayıt tarihini GETDATE() komutu ile bu günün tarihi olarak çekmesini sağladım.\nArdından, kayıt tarihinde yaptığım uygulamayı kullanıcı bilgilerini güncellediğinde de\ngüncelleme tarihi olarak yapmasını istedim ve bunun için de bir tetikleyici oluşturdum.\n\n```\nCREATE TRIGGER trg_AfterInsert_Kullanici\nON Kullanıcılar\nAFTER INSERT\nAS\nBEGIN\n UPDATE K\n SET KayıtTarihi = GETDATE()\n FROM Kullanıcılar K\n INNER JOIN inserted I ON K.UserID = I.UserID;\nEND;\n```\n```\nCREATE TRIGGER trg_AfterUpdate_Kullanıcılar\nON Kullanıcılar\nAFTER UPDATE\nAS\nBEGIN\n UPDATE K\n SET GuncellemeTarihi = GETDATE()\n FROM Kullanıcılar K\n INNER JOIN inserted I ON K.UserID = I.UserID;\nEND;\n```\n\nKullanıcılar tablomdaki tetikleyicilerimi bitirdikten sonra sipariş oluşturduğumuzda da\ngüncel tarihi çekip giren bir trigger oluşturdum.\n\n```\nCREATE TRIGGER trg_AfterInsert_Siparisler\nON Siparisler\nAFTER INSERT\nAS\nBEGIN\n UPDATE S\n SET SiparisTarihi = GETDATE()\nSQL Online Shopping Project 4\n FROM Siparisler S\n INNER JOIN inserted I ON S.UserID = I.UserID;\nEND;\n```\n\nArdından yine sipariş oluşturduğumuzda ürünler tablosuna ulaşıp siparişte yazan sayı\nkadar stok miktarı azaltan ve stok bilgisinin yanlış olarak kalmasını engelleyen bir\ntetikleyici daha oluşturdum.\n\n```\nCREATE TRIGGER trg_StokMiktarı\nON Siparisler\nAFTER INSERT\nAS\nBEGIN\n UPDATE Urunler\n SET Stok = Stok - S.Adet\n FROM Urunler u\n INNER JOIN inserted S ON u.UrunID = S.UrunID;\nEND;\n```\nTetikleyicilerimi bitirdikten sonra artık verilerimi girmeye başladım. Verileri girerken\ngerçekçi olmalarına özen gösterdim. Birkaç ismi baz alarak, bu isimleri döngülerle belirli\ndüzenlerde giriş yaptım. Bu işlemi sadece kullanıcılar tablosunda değil, aynı zamanda\nadresler, satıcılar ve ürünler tablolarımda da gerçekleştirdim. Kodlar uzun olduğu için\nkullanıcılar tablomun veri oluşturma kodunu aşağıya örnek olarak bırakıyorum.\n\n```\nbegin transaction\ndeclare @counter int\ndeclare @ad nvarchar(max)\ndeclare @soyad nvarchar(max)\ndeclare @telno nvarchar(30);\n\nset @counter = 0\n\nwhile @counter \u003c 100000\nbegin\n    set @ad =(\n            case\n                when @counter % 9 = 0 then 'MEHMET'\n                when @counter % 9 = 1 then 'HÜSEYİN'\n                when @counter % 9 = 2 then 'YUSUF'\n                when @counter % 9 = 3 then 'FATMA'\n                when @counter % 9 = 4 then 'MERYEM'\n                when @counter % 9 = 5 then 'ESRA'\n                when @counter % 9 = 6 then 'OSMAN'\n                when @counter % 9 = 7 then 'FATİH'\n                when @counter % 9 = 8 then 'ÖZLEM'\n                when @counter % 9 = 9 then 'KADİR'\n            end\n            );\nset @soyad =(\n            case\n                when @counter % 9 = 0 then 'VURAL'\n                when @counter % 9 = 1 then 'KAYA'\n                when @counter % 9 = 2 then 'ÖZER'\n                when @counter % 9 = 3 then 'CANACANKATAN'\n                when @counter % 9 = 4 then 'TEKİN'\n                when @counter % 9 = 5 then 'KOÇ'\n                when @counter % 9 = 6 then 'CÖMERT'\n                when @counter % 9 = 7 then 'YÜKSEL'\n                when @counter % 9 = 8 then 'KAYA'\n                when @counter % 9 = 9 then 'ÇOLAK'\n            end\n            );\nset @telno =\n        CONCAT(\n                SUBSTRING(CAST(ROUND(RAND(), 10) * 1000000 AS NV\n                SUBSTRING(CAST(ROUND(RAND(), 10) * 100000 AS NVA\n            );\n insert into Kullanıcılar(AdresID,Ad,Soyad,TelNo,Email)\n values\n     (\n        @counter,\n        @ad,\n        @soyad,\n        @telno,\n        'postadresi' + CAST(@counter + 1 as nvarchar(100)) + '@g\n     )\nset @counter = @counter + 1\nend\nSELECT * FROM Kullanıcılar\ncommit\n```\n\nTablolarımın verilerini girdikten sonra artık veritabanım sipariş oluşturmaya hazırdı.\nAncak her seferinde tek tek \"INSERT INTO\" ile siparişleri girmek istemedim. Bu sipariş\ngiriş işini kolaylaştırmak için bir prosedür oluşturdum. Bu prosedür sayesinde tablonun\nkolonları ve uzun kodlarla uğraşmama gerek kalmadan, kısa bir prosedür çağırma kodu\nile verilerimi rahatlıkla girebildim\n\n```\nCREATE PROCEDURE SiparisEkle\n    @UserID INT,\n    @UrunID INT,\n    @OdemeID INT,\n    @Adet INT\nAS\nBEGIN\n    INSERT INTO Siparisler (SiparisID, UserID, UrunID, OdemeID,\n    VALUES (NEWID(), @UserID, @UrunID, @OdemeID, @Adet);\nEND;\n\n--aynı şekilde prosedürü çağırma kodum\nexec SiparisEkle\n    @UserID = 1,\n    @UrunID =282951,\n    @OdemeID = 1,\n    @Adet = 937\n```\n\nSiparişleri rahat bir şekilde girdikten sonra hangi kullanıcıların hangi adreslere sahip\nolduğunu, sipariş detaylarını ve hangi kullanıcının ne sipariş verdiğini tek tek uzun\nkodlar ile her seferinde kontrol etmek yerine, bu işlemi daha kullanışlı hale getirmek için\nview'lar oluşturdum. View'lerim üzerinden istediğim kolonları rahatça düzenleyebiliyor ve\ntek satırlık bir kod ile bu tabloyu ekrana getirebiliyorum.\n\n\nKullanıcılarımın ne sipariş verdiğini gördüğüm view:\n```\ncreate view vw_Kullanıcı_Siparisleri as\nSelect K.Ad, K.Soyad, K.Email, S.SiparisID, S.Adet, S.SiparisTar\nFrom Kullanıcılar K JOIN Siparisler S on K.UserID=S.UserID\n```\n\nKullanıcılarımın bilgilerini özetleyip hangi adrese ve iletişim adresine sahip olduğunu\ngösteren view:\n\n```\ncreate view vw_Kullanıcı_Adresleri as\nSelect K.Ad, K.Soyad, K.Email, K.TelNo, A.AdresAdı, A.Adres\nFrom Kullanıcılar K JOIN Adresler A on K.AdresID=A.AdresID\n```\n\nSiparişlerin tüm detaylarını ayrıntılı bir biçimde gösteren, toplam tutarı hesaplayan\nve birçok tablonun birleşiminden oluşan view:\n\n```\nCREATE VIEW vw_SiparisDetaylarıToplamTutar AS\nSELECT\n    s.SiparisID,\n    k.Ad AS KullaniciAdi,\n    k.Soyad AS KullaniciSoyadi,\n    a.AdresAdı AS KullaniciAdresi,\n    o.OdemeSekli AS OdemeTuru,\n    u.UrunAdı,\n    u.UrunFiyat,\n    s.Adet,\n    s.Adet * u.UrunFiyat AS ToplamTutar,\n    s.SiparisTarihi\nFROM\n    Siparisler s\n    INNER JOIN Kullanıcılar k ON s.UserID = k.UserID\n    INNER JOIN Adresler a ON k.AdresID = a.AdresID\n    INNER JOIN OdemeTuru o ON s.OdemeID = o.OdemeID\n    INNER JOIN Urunler u ON s.UrunID = u.UrunID;\n```\n\nÖncelikle, bu eğitim fırsatını bize sağladığınız için başta Ahmet Kaya hocama,\nsonrasında da www.techcareer.net’e çok teşekkür ederim. Bu bootcamp, sektöre dayalı\nçok verimli bilgiler öğrenmemize olanak sağladı ve SQL'in en ince ayrıntılarına kadar\ndetaylı bir şekilde incelenmesini sağladı. Daha önce birkaç platform ve üniversite\ntarafından SQL dersi almış olmama rağmen, bu kadar derinlemesine öğrenmemiştim.\nBu süreçte özellikle veritabanı tasarımı, normalizasyon, trigger kullanımı gibi konular\nüzerinde detaylı çalışma imkanı buldum. Bunun yanı sıra, SQL'in performans\noptimizasyonu ve karmaşık sorguların yazımı gibi pratik becerileri de geliştirdim. Eğitim\nsürecinde elde ettiğim bu derin bilgileri, iş hayatımda etkili bir şekilde kullanmayı\nhedefliyorum.\nTeşekkürler.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmemirdogan%2Fonlineshoppingdb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmemirdogan%2Fonlineshoppingdb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmemirdogan%2Fonlineshoppingdb/lists"}