<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Merve Dumlubınar on Medium]]></title>
        <description><![CDATA[Stories by Merve Dumlubınar on Medium]]></description>
        <link>https://medium.com/@ozermerve?source=rss-785e589bf8ad------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*WUxcTao0H2zhzQuaTNGhGQ.jpeg</url>
            <title>Stories by Merve Dumlubınar on Medium</title>
            <link>https://medium.com/@ozermerve?source=rss-785e589bf8ad------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 04:14:20 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@ozermerve/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[How to Use Multiple Datasource in a Spring Boot Application?]]></title>
            <link>https://medium.com/@ozermerve/how-to-use-multiple-datasource-in-a-spring-boot-application-c9239ac8395?source=rss-785e589bf8ad------2</link>
            <guid isPermaLink="false">https://medium.com/p/c9239ac8395</guid>
            <category><![CDATA[entitymanager]]></category>
            <category><![CDATA[transactional]]></category>
            <category><![CDATA[multiple-datasources]]></category>
            <category><![CDATA[spring-boot]]></category>
            <dc:creator><![CDATA[Merve Dumlubınar]]></dc:creator>
            <pubDate>Sat, 01 Apr 2023 20:39:11 GMT</pubDate>
            <atom:updated>2023-04-01T20:39:11.977Z</atom:updated>
            <content:encoded><![CDATA[<p>We know that our backend projects need to connect with databases. So far, you have already used a database, JPA, hibernate… But what if you need to connect with multiple datasource?</p><p>In this tutorial, you’ll find out how to deal with multiple datasources in your Spring Boot project.</p><p>I published an example project with two datasources (PostgreSQL and MSSQL) on Github =&gt; <a href="https://github.com/merveozer/multiple-db">It’s here!</a></p><p><strong><em>I will code an example with EntityManagerFactory and a transaction query (an insert operation) in the next tutorial.</em></strong></p><ol><li>Add the secondary datasource’s connection information to application.properties.</li></ol><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8c31e34357b179cb84dc89a7a8eacbfa/href">https://medium.com/media/8c31e34357b179cb84dc89a7a8eacbfa/href</a></iframe><p>2)Create two packages for each datasource that has nested packages named “model”, “repository”, “controller”, “dbconfig” .</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/360/1*dcJeEMySwpBJg4r0YMNn0w.png" /></figure><p>You have already know what include entity, controller and repository packages. Therefore we can skip to dbconfig package. Spring Boot automatically create the datasource bean for us<strong> </strong>thanks to<strong> </strong>spring-boot-starter-data-jpa. In this case we will create our own configuration classes.(One for PostgreSQL and one for MSSQL)</p><p>There are three part basically in this configuration.</p><p>As the name suggests <strong>DataSource</strong> builder create a datasource. We mark one of our databases config as @Primary. We will do the same for LocalContainerEntityManagerFactory and PlatformTransactionManager.</p><p>We can easily set up a shared JPA <strong>EntityManagerFactory</strong> in application context. The EntityManagerFactory can be passed to our repository by this way<strong><em>. I will code an example with EntityManagerFactory and a transaction query in the next tutorial.</em></strong></p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7b460b2fda2fd2d3e5f479c2b77e10fd/href">https://medium.com/media/7b460b2fda2fd2d3e5f479c2b77e10fd/href</a></iframe><p>Then, you should create an another @Configuration class for other data source. The same things will set up for secondary data source. But there is no @Primary annotation.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a9c5e25221566b91b841478d5461bcd6/href">https://medium.com/media/a9c5e25221566b91b841478d5461bcd6/href</a></iframe><p>You can examine other packages from github repository. Actually there is no big differences from a Spring project that has got one data source. Therefore, I will not explain their includes.</p><p>Thanks for reading…</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c9239ac8395" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Send Data from Child to Parent in React]]></title>
            <link>https://medium.com/@ozermerve/how-to-send-data-from-child-to-parent-in-react-ac8878830a92?source=rss-785e589bf8ad------2</link>
            <guid isPermaLink="false">https://medium.com/p/ac8878830a92</guid>
            <category><![CDATA[callback-function]]></category>
            <category><![CDATA[usestate]]></category>
            <category><![CDATA[props]]></category>
            <category><![CDATA[react]]></category>
            <dc:creator><![CDATA[Merve Dumlubınar]]></dc:creator>
            <pubDate>Sun, 27 Nov 2022 20:46:42 GMT</pubDate>
            <atom:updated>2022-11-27T21:03:40.777Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/426/1*EPx-hY3-GmQkP-1z-Jl1yQ.gif" /></figure><p>Let’s start with a simpler question. <em>How to pass data as parameters from one React component to the other? </em>As you guessed, we can send our data from one to the other via props. They flow one way in React =&gt; from parent to child…</p><p>If data needed to be sent from parent to grandchild (Child B), you can use prop drilling, even though it’s not recommended. Actually, the reason why not recommended prop drilling is the component that don’t need the props have to has the props.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/403/1*pL2W-YgenJ33yg2LYOFz2Q.png" /></figure><p>By the way, you can use a better alternative: useContext. It would make sense to use useContext especially if there is more than one level.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/945/1*s9RMtmW8Lymb8KBHRS1AMg.png" /></figure><p>Anyway, let’s get to the point. So far, we talk about to one way flows. What if i wanted to pass data from child component to the parent? It sounds weird, doesn’t it? I was very surprised when i hear it can be possible. This can be better illustrated with an example.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a1c05f2e771f045dc6cfca1e0b4215b0/href">https://medium.com/media/a1c05f2e771f045dc6cfca1e0b4215b0/href</a></iframe><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1e0f79fd1e0749251b3490f789fb38aa/href">https://medium.com/media/1e0f79fd1e0749251b3490f789fb38aa/href</a></iframe><p>1) Firstly, let’s create our components.</p><p>2) Import the child component in the parent component.</p><p>3) Pass event (sendData) as props to Child component.</p><p>4) Assign sendData to onClick event in Child component.</p><p>5) Then, define a state in the parent component.</p><p>6) Define a method (callBackFunction) in the parent component. This method set the data using the useState.</p><p>This was a simple example of how to send data from the child to the parent component.</p><p>I hope you find this article is helpful…</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ac8878830a92" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What Problem Does Spring Framework Basically Solve?]]></title>
            <link>https://medium.com/@ozermerve/what-problem-does-spring-framework-basically-solve-10ae9f7a1ce6?source=rss-785e589bf8ad------2</link>
            <guid isPermaLink="false">https://medium.com/p/10ae9f7a1ce6</guid>
            <category><![CDATA[java-ee]]></category>
            <category><![CDATA[spring]]></category>
            <category><![CDATA[java]]></category>
            <dc:creator><![CDATA[Merve Dumlubınar]]></dc:creator>
            <pubDate>Fri, 18 Nov 2022 19:55:27 GMT</pubDate>
            <atom:updated>2022-11-18T19:58:11.447Z</atom:updated>
            <content:encoded><![CDATA[<p>First of all, I would like to mention information that I thought might be useful for our topic. Therefore, it would be great to say a few words about frameworks and Java EE before moving on to Spring.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/825/1*3YKtx6HDFhXp04Dl_GVXqw.png" /></figure><p>Now let’s put Spring aside and think. Why do we need frameworks? Is it possible to build a website without any frameworks? Of course, it is possible but there would be too many codes. Because although your application is unique, it has common issues like database connectivity, authentication, or logger like all other applications. In other words, we can produce a solution for every need without using frameworks. However, these solutions also covered the common needs of each project. If so, let’s keep in mind the fact that frameworks increase development speed. We will come back to the topic of speed later.</p><p>Let’s <em>downcasting</em> and come to the world of Java from frameworks. Perhaps the first suggested solution for the common needs I just said was Java EE (Jakarta EE). It also pursued solutions to similar problems. How do we ensure security, cache, scalability, and performance… However, it was not easy to create such an inclusive structure. Therefore, various mistakes made it difficult to use (like EJBs). One of the developers who had trouble with these difficulties was Rod Johnson. His goal was to make what Java EE offers simpler way. It’s also <em>faster</em>, as we just talked about.</p><p>I am aware that we still haven’t answered the question in the title. So let’s talk a little bit about that. Let’s imagine a typical Java application. There are classes, classes have fields and behaviors, and classes have relationships with each other. “Is a” and “Has a” can be given as examples of relationship types that express this network.</p><p>In addition, objects can be dependent on each other. Assume that two classes that use each other. Most likely if there is a modification on one object have to require modification on the other. This relationship is called dependency. We can say that this is the most fundamental issue that Spring aims to produce a solution to: Dependency Injection.</p><p>To be honest, earlier in my career, I thought dependency is a bad thing. But in the world of our application, objects must communicate with each other. When some objects throw an error, someone has to catch it. Some classes must provide an instance for other objects to use. Dependency is a natural process of software. We will not try to escape from dependency, we will manage them well. How to better manage them will not be answered in this article. Still, we have a few things to say.</p><p>Firstly, the dependency type I’m mentioning here is the “usage” type. I mean the object of class A is needed in another class. Like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/288/1*0MP7e8EIRTcRaG-BQbejrw.png" /></figure><p>Although this code sample is very short, it has a huge mistake. There is no need to create an instance of the supplier in the customer to be able to use the supplier. The client should not be responsible for creating the object that it will use. It is enough to know the interface of the supplier. <em>“Program to an interface, not an implementation…”</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/397/1*dXlK0qTXOjVYKpBqeknugQ.png" /><figcaption>Now the Client has no responsibility to create the Supplier.</figcaption></figure><p>Anyway, there are even better ways to solve this. Better yet, Spring does it for us.</p><p>In brief, when a Spring application ran, Spring doesn’t just create objects. It adds dependencies to the project with XML configurations or annotations (like @Autowired). It creates objects, it manages dependencies, it throws exceptions, it initiates transactions… In this way, we do not have to do dependency management.</p><p>Happy coding …</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=10ae9f7a1ce6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How would you describe stack and heap memory spaces in Java runtime?]]></title>
            <link>https://medium.com/@ozermerve/heap-stack-14184f50708d?source=rss-785e589bf8ad------2</link>
            <guid isPermaLink="false">https://medium.com/p/14184f50708d</guid>
            <category><![CDATA[heap]]></category>
            <category><![CDATA[memories]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[garbage-collector]]></category>
            <category><![CDATA[stack]]></category>
            <dc:creator><![CDATA[Merve Dumlubınar]]></dc:creator>
            <pubDate>Sun, 06 Nov 2022 17:21:53 GMT</pubDate>
            <atom:updated>2022-11-06T17:30:08.529Z</atom:updated>
            <content:encoded><![CDATA[<p>Let’s take a look at these memory spaces together.</p><p>Two different memory spaces are used in runtime by programming languages. Heap is used to creating an object by JVM. It is also known as “dynamic memory”. Instance variables are located in the heap while local variables are located in the stack. I still haven’t mentioned primitive types or complex types. Because data types don’t matter when discussing this issue.</p><p><em>There is a general belief that primitive types are in the stack, and complex types are in the heap. But this isn’t a correct belief because object variables are stored in heap regardless of their types.</em></p><p>Firstly, stack memory contains values that specific to methods. Therefore, these values’ lifetime is ended as soon as their method finishes running. When a method is called, space is allocated for this method in the stack. Let’s think about our Java application… Which is the first method called when Java executes a program? As you guessed, it is the main method. In that case, the stack starts to fill up with the main method. Then the other method calls take their place in the stack with <em>their local variables</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/959/1*rMxH7mrS1brN3oPOpB-sIw.png" /></figure><p>Secondly, when a new object is created, this object is stored in the heap. The reference of that object is in the stack.</p><p>In short, <strong><em>methods, local variables, and reference variables</em></strong> of the objects stored <strong><em>in the</em></strong> <strong><em>stack</em></strong>. <strong><em>Objects and instance variables</em></strong> (regardless of their types) are stored <strong><em>in the heap</em></strong>. Garbage Collector removes the object that has no reference from the heap.</p><p>Let’s understand with the help of an example.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1LsG2puBo1Fd2y5bCPri6w.png" /></figure><p>Both the midtermGrade and the passingGrade are also primitive types. But midtermGrade is stored in the heap because it is an instance variable. passingGrade is a local variable and it is stored in the stack. <strong>As you can see the data type is not related to where the object will be stored.</strong></p><p>Looking at the last two lines, there is no variable pointing to the first created student object. This means that the garbage collector will collect the first student object.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/768/1*4ZFNTJOZgJhJ9E3n2XjlDA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/712/1*ejjaqc_qdMkWyfVaOZrjrw.png" /></figure><p>I hope it works for you, happy coding…</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=14184f50708d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Let’s explain inheritance in Java. What are its types and how are they used?]]></title>
            <link>https://medium.com/@ozermerve/lets-explain-inheritance-in-java-what-are-its-types-and-how-are-they-used-bf4551f39e37?source=rss-785e589bf8ad------2</link>
            <guid isPermaLink="false">https://medium.com/p/bf4551f39e37</guid>
            <category><![CDATA[inheritance]]></category>
            <category><![CDATA[oop]]></category>
            <category><![CDATA[java]]></category>
            <dc:creator><![CDATA[Merve Dumlubınar]]></dc:creator>
            <pubDate>Mon, 31 Oct 2022 22:35:06 GMT</pubDate>
            <atom:updated>2022-11-02T08:26:04.588Z</atom:updated>
            <content:encoded><![CDATA[<p>I have a lot of notes that are on paper or notebooks. I decided to keep them on my Medium blog to both digitize and share. The first mini-post in “Let’s explain” series is about inheritance in Java.</p><p>Inheritance is an important part of OOP. It allows to use fields and behaviors of the parent class when the child class extends from parent class. Therefore reuse is possible thanks to inheritance. <br> We can also add new fields and methods to child class while inheriting parent class’s fields and behaviors. This usage is an instance of “is-a relationship”. Because <em>child class also is a parent class.</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/439/1*Ex5mKvHgVAnWnyB47uEUYg.png" /></figure><p>Let’s say Employee is parent class of Programmer class. Programmer class can inherit all the properties and behaviors, this means that programmers are a type of employee. <em>In addition, there can be new fields and methods that make a programmer a programmer.</em></p><p>What makes a programmer a programmer?</p><p>Getting a salary? Well, it seems as if behavior of getting a salary is common for all employees. In that case, there is no need to define this method for each class. The method of getSalary() already is inherited from Employee class. But behavior of writeCode() is special for the programmer. Therefore we have to describe writeCode’s implementation in programmer class.</p><p>There are three types of inheritance that can be used in Java: single, multilevel and hierarchical. Single inheritance is define that a class inherits another class. Single’s example is that relation of between the programmer and the employee class. Let’s assume in this example employee inherits person class. Also in this situation, we can talk about a chain of inheritance. Secondly, relation of between programmer and person classes are called “multilevel inheritance”. And for the third kind of the inheritance let’s say there is a new class that has a name: “Psychologist”, both of child classes (Psychologist and Programmer) inherits Employee. That means this relation is hierarchical inheritance.<br> <br> We cannot use multiple inheritance in Java. For instance, Programmer can’t inherit also Manager while inheriting Employee. But we can implement multiple interfaces.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/757/1*c5bVVQk2bvWYmz03omNX8A.png" /><figcaption><a href="https://www.javatpoint.com/inheritance-in-java">https://www.javatpoint.com/inheritance-in-java</a></figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bf4551f39e37" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Embedded Id ve Embeddable Class Nedir?]]></title>
            <link>https://medium.com/@ozermerve/embedded-id-ve-embeddable-class-nedir-6e5bc35865e9?source=rss-785e589bf8ad------2</link>
            <guid isPermaLink="false">https://medium.com/p/6e5bc35865e9</guid>
            <category><![CDATA[jpa]]></category>
            <category><![CDATA[database]]></category>
            <category><![CDATA[embedded-id]]></category>
            <category><![CDATA[java]]></category>
            <category><![CDATA[embeddable-class]]></category>
            <dc:creator><![CDATA[Merve Dumlubınar]]></dc:creator>
            <pubDate>Thu, 16 Dec 2021 18:44:30 GMT</pubDate>
            <atom:updated>2021-12-16T18:44:30.212Z</atom:updated>
            <content:encoded><![CDATA[<p>JPA ile çalışıyorsak Entity katmanında oluşturduğumuz classların @Id anotasyonuna sahip olan bir fieldı olmak zorunda. Yani JPA, id kolonu belirtilmemiş bir tablo oluşturmaya izin vermiyor. Veritabanı tarafından baktığımızda ise genellikle id fieldına denk gelen Primary Key (PK)’in atomik bir yapıda olması gerektiğini biliyoruz. Ancak bazen tablolar ideal olana uygun şekilde kurgulanmayabiliyor. Haliyle başta bahsettiğim @Id anotasyonuna sahip olacak bir alan da tanımlayamıyoruz. Geçtiğimiz hafta tam da bu şekilde ideal olana uymayan, aşina olmadığım yapıdaki bir tablo ile çalışmak durumunda kaldım. Durum kısaca şu şekildeydi: Servis yazılacaktı ancak id kolonu olmayan ve PK ‘sı atanmamış bir tablo geldi. İş akışına bakıldığında ilgili senaryoda o zamana kadar bir id kolonuna ihtiyaç duyulmamıştı ve olmayışının olumsuz bir etkisi de yoktu. Tablonun PK’sı mantıksal olarak dört kolonun bir araya gelmesiyle oluşuyordu. Ben de bu dört kolonu birleştirerek bir id alanı oluşturmalıydım. İşte bu noktada yardımıma “EmbeddedId” koştu.</p><p>Embedded Id oluşturmak için öncelikle id’ye karşılık gelecek olan fieldlardan oluşan bir class oluşturulması gerekiyor. Bu classımızın özelliği ise elbette Embeddable olması olacak.</p><p>Örneğin elimizde öğretmenlerin bilgilerinin tutulduğu bir teacher tablosu olsun. Tabloda region id, grade id, school id, class id, name, lastname ve birthyear kolonları mevcut. Region id, grade id, school id, class id alanlarından oluşan bir composite id olduğunu da varsayalım. Bunu entity katmanına taşımak için öncelikle dört alandan oluşan bir class oluşturacağız. Daha sonra bu class, teacher classının içine id fieldı olarak gömülecek.</p><p>Öncelikle tablo yapısını inceleyelim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/728/1*AjmS69aD0KvM9UYQ3tJLfg.png" /><figcaption>(Tabloda dört kolonun beraber PK oluşturduğu görülmekte ancak EmbeddedId kullanımı için veritabanında muhakkak PK belirtme gerekliliği yoktur.)</figcaption></figure><p>Teacher classında kullanmak için oluşturduğumuz Embeddable class (Id classı):</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/83959a531ff7f0d6fd37e4e9abbd07b9/href">https://medium.com/media/83959a531ff7f0d6fd37e4e9abbd07b9/href</a></iframe><p>Göze çarpan ifadelerden ilki @Embeddable anotasyonu, bir diğeri ise classımızın Serializable interfacesinin kullanılması. Embeddable anotasyonu adından da belli olduğu gibi ilgili classın farklı bir class içine gömülebilir bir yapıda olduğunu belirtmekteyken Serializable interfacesi ise oluşturulan nesnenin ihtiyaç halinde tekrar tekrar kullanılabilmesine olanak sağlamaktadır.</p><p>Embeddable class oluşturulduktan sonra @Embedded anotasyonu ile istediğimiz yere yerleştirebiliriz. Örnekte hedefimiz Embedded Id oluşturmak olduğu için Embeddable classı gömeceğimiz classın içinde id fieldının anotasyonu @EmbeddedId şeklinde olacak.</p><p>Teacher classı:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b87608f9f45a5612f05bae49dc5f490e/href">https://medium.com/media/b87608f9f45a5612f05bae49dc5f490e/href</a></iframe><p>Böylece veritabanında PK tanımlansın ya da tanımlanmasın biz JPA’nın işine yarayacak bir id fieldı oluşturmuş oluyoruz. Ancak bunu yapmadan önce Java Persistence’da da önerildiği gibi eğer veritabanına müdahale şansımız varsa önceliğimiz gerçekten de bir PK alanı oluşturmak olmalıdır.</p><p>JSON çıktısında da id alanını oluşturan fieldlar aşağıdaki şekilde bir arada gösterilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/598/1*BaRXWSB2fNnQ22f_G8Navg.png" /><figcaption>JSON çıktısı.</figcaption></figure><p>Tahmin ettiğiniz gibi Embeddable Class sadece Embedded Id oluşturmak için kullanılmıyor. Birden çok yerde <strong>tekrar eden kolonları</strong> bu şekilde gömülebilir hale getirip, <strong>birden çok kez kullanabiliriz</strong>. Örneğin on farklı kullanıcı tipinin olduğu bir senaryo düşünelim. On kullanıcı için on ayrı tablo kurgulanmış olsun ve hepsinde de adres bilgilerinin tutulduğu üç kolon tekrar ediyor. <strong><em>(Burada normalizasyon kurallarına bağlı kalınarak adres tablosunun ayrı tutulması gerektiği ve one to many ilişkisinin kurulması gerekliliği göz ardı edilmiştir. Bu senaryoda da elinizde ideal şekilde kurgulanmamış ve müdahale edemediğiniz bir tablo olduğunu düşünün.)</em></strong><em> </em>Her classta adres bilgilerini tekrarlamaktansa bir defa Embeddable bir class oluşturarak onu tekrar tekrar kullanabiliriz. Üstelik birden fazla satır yazmak yerine tek satırda adres bilgilerini tanımlamış oluyoruz.</p><p>Ayrıca birden çok kolonu PK olarak tanımlama (Composite Primary Key) konusunda <strong>@IdClass anotasyonunu</strong>n kullanımına da bakabilirsiniz.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6e5bc35865e9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Nesne Yönelimli Programlama Felsefesi ve Temel Özellikleri]]></title>
            <link>https://medium.com/@ozermerve/nesne-y%C3%B6nelimli-programlama-felsefesi-ve-temel-%C3%B6zellikleri-c0803397088c?source=rss-785e589bf8ad------2</link>
            <guid isPermaLink="false">https://medium.com/p/c0803397088c</guid>
            <category><![CDATA[encapsulation]]></category>
            <category><![CDATA[oop]]></category>
            <category><![CDATA[inheritance]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[abstract]]></category>
            <dc:creator><![CDATA[Merve Dumlubınar]]></dc:creator>
            <pubDate>Wed, 27 Oct 2021 13:04:49 GMT</pubDate>
            <atom:updated>2023-08-16T18:04:25.849Z</atom:updated>
            <content:encoded><![CDATA[<p>Okumanızı bitirdikten sonra alttaki görsele göre hangi kadının daha iyi bir geliştirici olacağını düşünmenizi istiyorum. Fikirlerinizi yorumlarda belirtmeniz oldukça güzel olur :)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/1*BRo0YT4iTsjh-ZbUKlXTCg.jpeg" /><figcaption>(Gorsel-1)</figcaption></figure><p>Programlamaya yeni başlayanlar için Nesne Yönelimli Programlama (Object-Oriented Programming (OOP)) mantığının, class, inheritance, encapsulation gibi temel kavramların oldukça kafa karıştırıcı olabildiğinin farkındayım. En azından benim için durum böyleydi bu yüzden ben de anlatabildiğim en yalın haliyle bu konuları anlatmak istedim. Bu yazıda programlama yaklaşımlarını, nesne yönelimli programlamanın felsefesini ve dört temel kavramının açıklamasını bulacaksın.</p><p>Programlamanın kelime anlamına baktığımızda bir problemin çözümüne ilişkin komutlar, kelimeler, matematiksel işlemlerin bilgisayara tanıtılması gibi bir karşılık buluruz. Bu noktada matematik öğretmenlerimizin “bir problemin tek bir çözümü olmak zorunda değil, birden fazla çözüm olabilir” öğretisini hatırlamanızı istiyorum. Çünkü tıpkı matematikteki gibi yazılım geliştirmede de karşılaştığımız bu problemlerin birden çok çözüm yöntemi genellikle vardır ve biz bu yöntemler arasından en iyisini seçmeye çalışırız. Burada kastedilen en iyi elbette bizim en sevdiğimiz, en gözümüze hoş gelen anlamında değildir. O işin çözümü için en optimize yol, en doğru yaklaşım hangisiyse ve hangi programlama dili uygunsa en iyi de odur. Bunların OOP ile ilgisi yok gibi görünebilir ama konuya buradan girmeyi tercih etmemin sebebi Java, C, C#, Dart gibi birbirine alternatif olan programlama dilleri olduğu gibi OOP’nin de alternatifi olan yaklaşımların mevcut olduğunu anlatmak.</p><p>OOP her ne kadar şu an en fazla kullanılan yaklaşımlardan biri olsa da programlama için kullanılan tek yaklaşım değildir. Fonksiyonel programlama, prosedürel programlama, mantıksal programlama gibi farklı yaklaşımlar da mevcuttur. Örneğin prosedürel programlamanın amacı problemi parçalara bölmek daha sonra da adım adım bu parçaları birleştirmektir. Bu mantığı kullanan dillere örnek olarak C verilebilir. Bu noktada programlamaya benim gibi <strong>Deitel’in</strong> C kitabındaki örneklerle başlayanlar ne demeye çalıştığımı hemen anlayacaktır. O örneklerde neler yaptığımızı kısaca hatırlamakta fayda var. Örneğin sayfa 193, 5.26 numaralı örneği inceleyelim.</p><blockquote>5.26 Eğer bir sayının kendisi hariç, bütün çarpanlarının toplamı yine o sayıya eşitse bu sayıya MÜKEMMEL SAYI denir. Örneğin, 6 bir mükemmel sayıdır. Çünkü 6 = 1 + 2 + 3. mukemmel isminde, sayi parametresinin mükemmel bir sayı olup olmadığını tespit eden bir fonksiyon yazınız. Bu fonksiyonu 1–1000 arasındaki tamsayılardan mükemmel olanlarını bulmak için bir program içinde kullanınız. Program sayının mükemmel olduğunu göstermek için mükemmel sayınının çarpanlarını ekrana yazdırsın. 1000‘den daha büyük sayıları test ederek bilgisayarınızın gücünü deneyebilirsiniz.</blockquote><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/22d73afe3dc18124dbc4efc3356ad03f/href">https://medium.com/media/22d73afe3dc18124dbc4efc3356ad03f/href</a></iframe><p>Şimdi bu problemi prosedürel programlamaya göre nasıl çözdüğümüze odaklanalım:</p><p>1) Araştırdığımız şey 1000’e kadar olan sayılar arasında bir mükemmel sayı varsa onu bulmak. Haliyle ilk adımda 1’den 1000’e kadar olan tüm sayıları gezen bir döngü kurmalıyız.</p><p>2) Tüm sayıları gezme kısmını döngü ile çözmüş gibi görünüyoruz. Peki bu sayıların çarpanlarının toplamlarının, sayının kendisine eşit olup olmadığının kontrolünü nasıl sağlayacağız? İşte bu noktada bir döngüye daha ihtiyacımız var. İkinci yani içteki döngümüz yine 1’den başlayacak ama bu sefer kontrol edilen sayının bir eksiğine kadar artması gerekecek ve bu sayılar kontrol ettiğimiz sayının bir çarpanı mı bunu tespit edecek. Çarpanları bulduktan sonra ise tüm çarpanları toplayarak toplam isimli bir değişkene atayacağız.</p><p>3) Üçüncü adıma geldiğimizde ise toplam isimli değişkenimiz ve kontrol ettiğimiz sayı birbirlerine eşit mi bunun kontrolünü sağlayacağız. Eğer eşitse bu sayıyı ekrana yazdırabiliriz çünkü sayı mükemmeldir. Eşitlik yoksa sayı mükemmel değil demektir.</p><p>4) Son adımda ise dıştaki döngü her yeni sayıya geçerken çarpanların toplamını sıfıra eşitleyeceğiz.</p><p>Gördüğünüz gibi mükemmel sayıyı bulan programı yazmak için <strong>adım adım ilerlenecek</strong> bir yol haritası çıkardık ve kodlarımızı da gerçekten bu adımlara uygun şekilde yazdık. Ya da fonksiyonel programlamaya baktığımızda programlamanın matematiksel fonksiyonlar şeklinde ele alındığını, yazılan her satırın fonksiyon tanımlar gibi olduğunu görürüz. Burada hedef <strong>yan etkileri azaltmak</strong> yani fonksiyonun her seferinde aynı şekilde çalıştığından emin olmaktır, veriler değişmez olarak kabul edilir. Esnek bir yapının olmayışı ilk bakışta dezavantaj gibi görünüyor olsa da <strong>big data ile çalışıyorsanız fonksiyonel programlama</strong> oldukça iyidir.</p><p>Bu örnekler uzatılabilir, farklı yaklaşımlarla programlanmış projeleri sizler de inceleyebilirsiniz. Fark etmenizi istediğim şey aslında OOP’nin yazılım geliştirirken kullanılan bir <strong>felsefe</strong> olduğu. Bu felsefenin, mantalitenin amacını doğru bir şekilde anladığınızda ise o çok karıştırdığımız interface, inheritance, polymorphism kavramlarının o kadar da zor olmadığını fark ediyorsunuz. Ayrıca bu yaklaşımlardan birini tercih ettiğinizde diğerlerini asla kullanamazsınız diye bir şey de yok tabi ki. Örneğin <strong>prosedürel programlama her zaman cebimizde bulunur.</strong> İş kurallarını tanımlarken oldukça da işe yarardır. Ama tüm sistemi sadece prosedürel yaklaşımla programlamak biraz zor olacaktır. Yani gerektiği yerde gereken yaklaşımı elbette kullanacağız.</p><p>OOP özelinde konuşacak olursam bunun bir felsefe olduğundan bahsettim. Bana göre böyle bir felsefeye ihtiyaç duyulmasının sebebi ise az önce bahsettiğim <strong>esneklik</strong> kavramını OOP ile projenize çok rahat entegre edebiliyor oluşunuz. Esnek ve değiştirilebilir projeler üretmenin önemini açıklamaya gerek dahi yok diye düşünüyorum çünkü içinde bulunduğumuz çağda her şey çok hızlı değişirken, ihtiyaçlar sürekli artarken statik ve değişmez parçalardan oluşan yazılımlar geliştirmek hiç mantıklı olmayacaktır 😊</p><p>OOP bize aradığımız bu esnekliği, program içinde kullanılacak her yapıyı ayrı ayrı birer nesne olarak tasarlayarak sunar. Yani OOP mantığına göre yazılan bir programda <strong>veriye dokunan her şey</strong> bir nesnedir. Örneğin bir banka uygulamasında uygulamayı kullanacak olan banka görevlileri, müşteriler, çekler, taksitler, ödemelerin hepsi birer nesnedir. Bu nesnelerin temelde iki kısmı vardır.</p><p>· Nitelikleri (özellikler)</p><p>· Yapabildikleri (davranışlar)</p><p>Bir otomobil düşünelim. <strong><em>Otomobili otomobil yapan</em></strong> özellikler neler olabilir? Tekerlekler, motor gücü, vites tipi, yakıt tipi bu özellikler arasında sayılabilir. Bu otomobil nesnesinin yapabildiği çeşitli davranışlar da vardır. En basit ve kesin haliyle hareket etmek bu davranışlardan biridir. Otomobil nesnesini otomobil yapan şeyleri sıraladık. Bunları programlama diliyle bilgisayara anlatmamız gerektiğinde ise <strong>class </strong>yapıları bizim imdadımıza yetişiyor. Classlar ile aslında gerçek dünyadaki nesneyi bilgisayarın anlaması için tanımlamış oluyoruz.</p><p>Nesnelerin temelde iki kısmı vardır demiştik. Yaptığımız bu tanıma göre nesnemizin niteliklerine artık <strong><em>properties</em></strong>, yapabildiklerine yani davranışlarına ise <strong><em>metot</em></strong> diyeceğiz. (Java’da metot olarak tanımlanan yapılar C’de fonksiyon olarak tanımlanır. Her ikisi de aynı yapıya karşılık gelir.)</p><p>O halde OOP ile modelleme yaparken ilk çıkış noktamız classlar. Programda ihtiyaç duyacağımız her şeyi <strong>class</strong> şeklinde oluşturup <strong>şablonlarını</strong> oluşturuyoruz. Şablon oluşturuyorsak eğer oluşturduğumuz bu classlar nesnemizin <strong>mümkün olan en soyut halini</strong> karşılıyor olması gerekir. Çünkü adı üstünde oluşturduğumuz şey o nesne için bir şablon, çerçeve, o nesneyi o nesne haline getiren temel özellikler…</p><p>OOP’nin 4 özelliğinden biri olan <strong>abstraction</strong> ile classları biraz daha yakından inceleyelim.</p><p><strong>1)</strong> <strong>Abstraction (Soyutlama)</strong></p><p>Nesnenin en soyut hali derken aslında içinde sadece temel özelliklerinin bulunduğu bir class oluşturmaktan bahsedilir. Otomobili otomobil yapan özelliklerden az önce bahsetmiştik. Tekerlekleri, motoru olmayan ya da hareket edemeyen bir otomobil bu nesneyi karşılayamaz. Tüm otomobillerde olmasını beklediğimiz en temel özellikler bunlardır diyebiliriz. Örneğin motorları üzerinden yola çıkalım. Tüm otomobillerin motorlarında illa turbo güç modu olmak zorunda mıdır? Elbette hayır. Turbo modu olmasa da bir motora sahip olması yeterlidir. Yani propertyleri bu şekilde detaylandırmadan aklımıza gelen <strong>ilk ve temel özellikleriyle</strong> bir classı oluşturabilme abstraction özelliğiyle uyumludur ve kesinlikle uygulanması gereken bir özelliktir. Çünkü o nesneye dair oluşturduğumuz ilk class sadece bir şablondur, temel özelliklerini barındırır ve aslında <strong><em>gerçek hayatta da</em></strong> <strong><em>somut bir varlığa denk gelmez.</em></strong></p><p>Bu noktada programlamadan biraz uzaklaşalım. Yeni bir araba aldığını söyleyen bir arkadaşınızla konuştuğunuzu hayal edin. Arkadaşınız bu haberi size “Geçen gün yeni bir araba aldım” şeklinde bildirdi. Sadece bu cümleyi duyduğunuzda hangi marka, modelde hangi özelliklere sahip bir araba aldığını bilmeniz mümkün mü? Elbette değil çünkü aslında size soyut bir classtan bahsetmiş oldu. Şu an için bildiğiniz arkadaşınızın tekerlekleri, motoru, vitesi olan ve hareket edebilen bir şeye sahip olduğu. O arabanın markasını, modelini söylediğinde ise siz o classtan hangi nesnenin üretildiğini öğrenmiş oldunuz. Yani soyut araba classını somutlaştırıp gerçek bir nesne oluşturmuş oldunuz. Örneğin arkadaşınız Ford/Fiesta aldığını belirtti. Aldığı araç manuel vites, 1.4 motor gücünde ve beyaz renk olsun. Şu anda gözünüzün önüne daha net bir görsel geliyor değil mi? Çünkü bir nesne oluşturduk ve o nesne <strong>soyut olan araba classının somut bir örneği</strong>. Farklı bir örnek daha verecek olursak bir pastaneye girdiğinizi ve satıcıya sadece “Tatlı alabilir miyim?” diye sorduğunuzu varsayın. Muhtemelen sorunuza karşılık yeni bir soru alacaksınız çünkü pastanede onlarca çeşit tatlı olabilir. Pastalar, kekler, şerbetli tatlılar, kekler, kurabiyeler… Hangisinden istediğinizin bilinmesinin mümkün olmama sebebi satıcıya sadece soyut olan classı belirtmiş olmanız. <strong>Tatlı classı pastanedeki tüm çeşitleri karşılar ama o soyut bir tanımdır. </strong>Onu göremeyiz, koklayamayız ya da ona dokunamayız. Ama havuçlu kek dediğinizde artık o soyut tanım somut hale gelmiş olur.</p><p>Ford/Fiesta ya da havuçlu kek örnekleri nasıl gerçek hayatta bir yer kaplıyorsa, classlardan oluşturduğumuz nesneler de aslında <strong>bilgisayarımızın RAM ’inde gerçekten yer kaplamaya ve haliyle yaşamaya başlıyorlar.</strong></p><p>Bir nesneye dair oluşturduğumuz bu ilk classa (sadece araba, tatlı dediğimizde kastettiğimiz şeye) “süper class, base class ya da parent class” denmektedir. OOP bu süper classtan yeni alt classlar türetmeye izin verir. Yani classlarımız arasında bir hiyerarşi olabilir. Hatta birbirlerine miras aktarır gibi özelliklerini aktarabilirler. O halde ikinci temel özelliğimiz olan <strong>inheritance</strong> kavramına geçelim.</p><p><strong>2)</strong> <strong>Inheritance</strong></p><p>İstediğimiz şey en başından beri yeni ihtiyaçlar ortaya çıktığında esnekçe değişim yapabilmekti, doğru ama bu esnekliği abstraction tek başına sağlayamıyor. Süper classımız sadece temel özellikleri barındırır demiştik çünkü olası yeni ihtiyaçlara göre <strong>süper classın özelliklerini barındıran ama fazladan başka özelliklere de sahip olabilecek</strong> sınıflar üretmemiz gerekebilir. Bunu örneklemek için otomobil classımıza geri dönelim. Otomobil sınıfının temel özellikleri arasında yakıt tipi, tekerlek, motor gücü, vites tipi ve hareket etme davranışı vardı. Farz edelim ki programa yeni bir otomobil dahil edilmesi gerekiyor. Bu yeni otomobil tekerlekler, yakıt tipi, vites tipi, motor özelliklerine sahip ve hareket etme kabiliyeti <strong>de</strong> olan ancak içerisinde bir yatak ve mutfak <strong>da</strong> barındırmak zorunda olan yeni bir tür yani karavan olsun. <strong>Karavan classı otomobil classının sahip olduğu tüm property ve metotlara sahip olmakla beraber bunun fazlasına da sahiptir</strong>. Ama benim karavan classını oluştururken otomobil classına yazdığım her şeyi tekrar karavan classında da yazmam <strong>gereksiz kod tekrarı</strong>na düşmem anlamına gelmektedir. Bunun yerine classların inheritance özelliğini kullanarak <strong>“Karavan da bir otomobildir”</strong> diyebiliyorum. Böylece otomobildeki tüm özellik ve metotları karavan classına da tek satırla aktarmış oluyorum. Karavan classına yazdığım şey sadece karavanın yatak ve mutfağa sahip olma özelliği olmuş oluyor.</p><p>Inheritance sayesinde bir kez tanımladığım otomobil classının özelliklerini tekrar tekrar kullanabiliyor oldum. Çünkü ekleyeceğim her yeni tür, base classın temel otomobil özelliklerini zaten miras almış oldu.</p><p><strong>3)</strong> <strong>Encapsulation</strong></p><p><em>Ekim 2022-Not: Bu bölüme olan bakış açım Akın Kaldıroğlu’ndan aldığım eğitimden sonra oldukça değişti. “Tamam da private yaptıktan sonra set metotlarıyla dışarıya tekrar açınca ne değişti ki?” diye kendi kendime sorduğum bir iki soruya gayet tatmin edici yanıtlar buldum. Bu kısmı ve polimorfizmi de en kısa zamanda güncelleyeceğim. Eski yazdıklarımı şimdilik kaldırmıyorum ancak encapsulation hiç bildiğimiz gibi değilmiş :)</em></p><p>Paketleme, sarmalama anlamlarına gelen encapsulation özelliği sayesinde oluşturduğumuz classları dışarıdan gelecek değişikliklere karşı korumaya almış oluyoruz. Bu korumanın önemi ise aslında en başta söylediğim “veriye dokunan her şey nesnedir” cümlesinde saklı. Nesneler hafızaları olan, içinde veri saklayan yapılardır. Ama bu veriyi kontrolsüzce sakladığımızda ya da herkesin müdahalesine açık hale getirdiğimizde programımız için hiç iyi sonuçlar doğurmayacağı da ortadadır. Otomobil classımızı hatırlayalım. Motor gücü şeklinde bir property tanımlamıştık bu property 90 hp değerini alabilir, mümkündür. Ancak -90 hp değerinde bir motor gücü tanımı istediğimiz bir şey değildir. Ya da kullanıcı tiplerini tanımladığın bir classta kişinin yaşının 320, kilosunun -45 girilebilmesine olanak tanımamalıyız.</p><p>Bu korumayı sağlamak içinse temelde iki araç kullanılır. İlki <strong>erişim belirleyici</strong> dediğimiz <strong>public, private</strong> anahtar kelimeleri. İkincisi ise <strong>“getter” ve “setter” metotları</strong>. Erişim belirleyicisi olarak public değer verdiğimiz bir yapıya programın her yerinden ulaşabiliyorken, private değer alan yapıya doğrudan erişimimiz mümkün değildir. Getter metodu ise o değerin sadece okunabilir olduğu anlamına gelirken, setter metodu sayesinde o değerde değişiklik yapabiliriz.</p><p><em>Ayrıca bu konu için ilk paragraftaki notu göz önünde bulundurduğumuzda şunları da eklemem gerekir. Encapsulation ile sadece teknik anlamda (get/set-access modifier) veriyi saklamanın ötesinde soyutladığımız fieldlarımızı ve davranışlarımızı ete kemiğe bürünür hale getiriyoruz. Classlar aracılığıyla ise bu sarmaladığımız şeyleri bir arada topluyoruz. Oluşturduğumuz classlar herhangi bir yerden çağrıldığında kimse içeride tam olarak ne olduğunu/neler yapıldığını bilmiyor. Sadece bir interface ile talep ettiği işi yaptırmış oluyor. Ama implementasyonu ile ilgili bilgi sahibi olamıyor ki olmamalı da zaten. İstemcinin implementasyon hakkında bilgi sahibi olması couplingi arttıracaktır.</em></p><p><strong>4)</strong> <strong>Polymorphism</strong></p><p>Inheritance sayesinde base classı miras alan ama kendine has farklı property ve metotları da olan yeni alt türler türetebildiğimizi söylemiştim. Polymorpism ile ise base classtan alınan metotun adını değiştirmeden yeni oluşturulan alt tür için o metotu <strong>modifiye</strong> edebilmekteyiz. Modifiye etmenin de <strong>override ve overload</strong> olmak üzere iki yolu vardır. Override edilmiş bir metotun içi miras alan sınıfa uygun olacak şekilde yeniden yazılmıştır. Overload edilen bir metot ise farklı parametreler kullanır.</p><p>OOP’nin dört temel özelliğini çok fazla kod karmaşasına girmeden, mantıklarını vererek açıklamaya çalıştım. Bundan sonraki yazılarda ise bu kavramların gerçek programlarda nasıl kullanıldığından bahsedeceğim.</p><p>Kaynaklar:</p><ol><li>Java Tutorials. ORACLE. <a href="https://docs.oracle.com/javase/tutorial/">https://docs.oracle.com/javase/tutorial/</a></li><li>Gorsel-1 ve görsel ile ilgili sorulan “Hangi kadın daha başarılı bir programcı olur?” sorusu Marmara Üniversitesi-Bilgisayar Programcılığı Öğretim Üyesi Zehra Aysun ALTIKARDEŞ’in ders sunumlarından alınmıştır.</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c0803397088c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Vue Router ve Component Aktarma]]></title>
            <link>https://medium.com/@ozermerve/vue-router-ve-component-aktarma-549c7cb3afe7?source=rss-785e589bf8ad------2</link>
            <guid isPermaLink="false">https://medium.com/p/549c7cb3afe7</guid>
            <category><![CDATA[vue]]></category>
            <category><![CDATA[components]]></category>
            <category><![CDATA[routing]]></category>
            <category><![CDATA[vue-router]]></category>
            <category><![CDATA[vuejs]]></category>
            <dc:creator><![CDATA[Merve Dumlubınar]]></dc:creator>
            <pubDate>Wed, 25 Aug 2021 21:16:14 GMT</pubDate>
            <atom:updated>2021-08-26T07:31:36.869Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/700/1*uFxytZm_CSoTNINEG061Ag.png" /></figure><p>Bu yazıda benim için yeni bir deneyim olan Vue ile ilgili iki işlemi açıklamaya çalışacağım. Bunların ilki <strong>route işlemi</strong>nin nasıl yapılacağı olacak. İkinci işlem ise oluşturduğumuz bir <strong>componenti farklı bir sayfaya dahil etmekle ilgili</strong>.</p><p>Route güzergah, rota anlamına gelirken web programlama dünyası için serverlara gelen <strong>isteklerin yönlendirilmesi</strong> şeklinde düşünülebilir. Haliyle birçok teknolojide route işlemi yapılmaktadır. Örneğin ASP.NET’in routing yapısında gelen istekler <strong>Controller</strong> ile karşılanır. Ve isteğe dönülecek yanıt ya da yapılacak işlemler bu sayede belirlenmiş olur.</p><p>Vue.js’in ise route işlemi için <strong>Vue Router</strong> adında resmi bir eklentisi bulunmaktadır. Kendi sitelerinde Vue Router’ın kolaylıkla <strong>Single Page Application</strong> (SPA) oluşturabileceğinden bahsedilmiştir. SPA, <strong>Multiple Pages Application</strong> yaklaşımıyla karşılaştırıldığında bu yönlendirme işlemini JavaScript kullanarak <strong>client</strong> <strong>tarafında</strong> gerçekleştirmeyi ve böylece yeni gelen her istek için tüm sayfayı <strong>yeniden yüklememeyi</strong> hedefler.</p><p>Router kullanabilmek için yapılması gereken işlemleri sırasıyla inceleyelim. Ancak öncelikle pratik amacıyla çalıştığım proje ait kısa videoyu izlemenizi öneririm. Senaryonun somutlaşması daha kolay olacaktır. <a href="https://drive.google.com/file/d/1DGyrBtsmlt0sL4A9JvI7ZWVT0yFOyzyg/view?usp=sharing">Videoya buradan ulaşabilirsin.</a></p><ol><li>1) Vue Router’ı kullanabilmek için öncelikle az önce bahsettiğimiz eklentiyi kurmamız gerekiyor. Bunun için terminale <strong>npm install vue-router </strong>komutunu giriyoruz.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/448/1*bSMGDieODlKY3TTLkalHtw.jpeg" /></figure><p>2. Kurulum tamamlandıktan sonra <strong>package.json</strong> dosyanızın <strong>dependencies</strong> bölümünden kontrolünü sağlayabilirsiniz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/347/1*X0sTMt1eUWITW0bQUxt23w.jpeg" /></figure><p>3. Diğer sayfaların içeriğini göstermeden önce her iki işlem sırasında <strong>App.vue</strong> içeriğini göstermek istiyorum. App.vue’ yi uygulamanın <strong>giriş noktası</strong>, <strong>kökü </strong>gibi düşünebilirsiniz. Aşağıda yapacağımız işlemler olurken App.vue componentinizin içinde sadece bunlar olmalıdır. Ve <strong>router-view</strong> etiketini kesinlikle buraya vermeniz gerekmektedir ki verdiğimiz routelar kendilerini sergileyecekleri bir alan bulabilsinler. Ancak bu componente başka bir sayfa import etmemeye, template kodları arasına bir şeyler yazmamaya özen gösterin yoksa benim gibi saatlerce neden App.vue’ye yazılanlar tüm sayfalarda tekrar ediyor diye düşünmek zorunda kalırsınız 😊</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/310/1*cwLnEsPjQoVMwNPpVivi5g.jpeg" /><figcaption>App.vue</figcaption></figure><p>4. Daha sonra main.js dosyasına;</p><p><strong><em>import VueRouter from ‘vue-router’</em></strong></p><p><strong><em>Vue.use(VueRouter)</em></strong> ve</p><p><strong><em>new Vue({</em></strong></p><p><strong><em>el: ‘#app’,</em></strong></p><p><strong><em>render: h =&gt; h(App),</em></strong></p><p><strong><em>router: router</em></strong></p><p><strong><em>})</em></strong></p><p>satırlarını ve ekliyoruz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/296/1*9l5_xEmMnp0-ogAZ2SCCJA.jpeg" /><figcaption>main.js</figcaption></figure><p>5. Artık <strong>VueRouter</strong> kullanıma hazır halde. Bu aşamadan sonra componentlerinizin <strong>import</strong> edilmesi ve <strong>path</strong>lerinin verilmesi gerekmekte. Videoda gördüğümüz her bir ekran aslında kod tarafında bir componenti temsil ediyor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/925/1*vQruVRPeIWZplR3yMVE_dA.jpeg" /><figcaption>Dosya dizini ve main.js.</figcaption></figure><p>Görselin sol tarafında görüldüğü gibi menüdeki her başlığa ait bir component mevcut. Main.js dosyasında ise sayfaları import edip path tanımları yapılmış. Bu işlemler için ayrı bir <strong>route.js</strong> sayfası da açabilirdiniz. Ancak benim projem çok büyük olmadığı için main.js’e eklemekle yetindim. <em>(Dosya yolları verilirken “ ./ ” kısmı src dosyasına denk gelmekte. )</em></p><p>Örnek:</p><p><strong><em>import Kayit from ‘./Pages/Kayit.vue’</em></strong></p><p><strong><em>const router = new VueRouter({</em></strong></p><p><strong><em>routes: [{path: ‘/kayit, component: Kayit}],</em></strong></p><p><strong><em>mode:’history’</em></strong></p><p><strong><em>})</em></strong></p><p>6. Örneğimize kayıt formundan devam edelim. Kayıt formuna yönlenebilmek için <strong>link verebileceğiniz bir elementiniz</strong> olmalı. Bu noktada dikkat edersek sunucumuz ilk çalıştığında Home sayfasını açıyor. Ve sağ üst köşede ÜCRETSİZ KULLAN yazılı butona tıkladığımızda ‘localhost:8080/kayit’ sayfasına yönleniyor. O halde Home.vue componentine ilgili butonu ekleyelim. Template ve script kodları bu şekilde olmalı.</p><p><strong><em>&lt;template&gt;</em></strong></p><p><strong><em>&lt;router-link to=”/kayit” &gt;</em></strong></p><p><strong><em>&lt;b-button class=”btn-free” variant=”primary”&gt;ÜCRETSİZ KULLAN&lt;/b-button&gt;</em></strong></p><p><strong><em>&lt;/router-link&gt;</em></strong></p><p><strong><em>&lt;/template&gt;</em></strong></p><p><strong><em>&lt;script&gt;</em></strong></p><p><strong><em>export default {name: ‘Home’}</em></strong></p><p><strong><em>&lt;/script&gt;</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/523/1*3rXCh813Bh7JRPCa0zP5_Q.jpeg" /><figcaption>home.vue</figcaption></figure><p>7. Kayit.vue componentine geldiğimizde ise <strong>script </strong>kodlarına</p><p><strong><em>&lt;script&gt;</em></strong></p><p><strong><em>export default{</em></strong></p><p><strong><em>name: “Kayit”,</em></strong></p><p><strong><em>}; &lt;/script&gt;</em></strong></p><p>Satırlarını eklemelisiniz. Bu aşamadan sonra template ve style kodları ile yönlendirilecek sayfayı oluşturmaya hazırsınız.</p><figure><img alt="register.vue" src="https://cdn-images-1.medium.com/max/186/1*Hsy_k30WeFZMEVx-y5egHw.jpeg" /><figcaption>Kayit.vue</figcaption></figure><p>Bu şekilde route tanımlamanızı basitçe yapabilirsiniz. Başta karmaşık gelse de aslında oldukça kolay.</p><p>Açıklanacak olan ikinci konunun component dahil etme olduğundan bahsetmiştim. Bu kavramla aslında şunu demeye çalışıyorum. Örneğin videoda her sayfada tekrarlanan bir navbar ve sidebar mevcuttu. Bazen bu şekilde <strong>tüm sayfalara dahil olması gereken alanlar</strong>ımız olabilir. Bu işlem içinse yapmamız gereken şey oldukça basit. Ben bu proje için NavSide.vue isminde bir component oluşturdum. Yukarıdaki dosya dizinin görüldüğü görselde de mevcut. Bu componente sadece navbar ve sidebar alanlarını kodladım. Daha sonra ilgili componentlere NavSide.vue componentini işte şu şekilde dahil ettim. <em>(Ancak bunu yapmadan önce NavSide’ın yine main.js’e import edildiğini ve routes kısmına dahil olduğunu unutma.)</em></p><p><strong><em>&lt;template&gt;</em></strong></p><p><strong><em>&lt;div&gt;&lt;NavSide/&gt;&lt;/div&gt;</em></strong></p><p><strong><em>&lt;/template&gt;</em></strong></p><p><strong><em>&lt;script&gt;</em></strong></p><p><strong><em>import NavSide from “./NavSide.vue”</em></strong></p><p><strong><em>export default ({name: ‘Raporlar’,components: {NavSide,},})</em></strong></p><p><strong><em>&lt;/script&gt;</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/370/1*lNNIjkpY93b0yAtt-o_gsA.jpeg" /><figcaption>Navbar ve sidebarın kullanıldığı sayfalardan biri. Raporlar.vue.</figcaption></figure><p>Ve böylece navbar/sidebar alanlarını istediğiniz tüm sayfalara aktarmış oldunuz.</p><p>Umarım faydalı bir yazı olmuştur. Okuduğunuz için teşekkürler.</p><p><em>Kaynakça</em></p><ol><li>Vue.js Web Sitesi, <a href="https://vuejs.org/">https://vuejs.org/</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=549c7cb3afe7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Northwind Veritabanı Kurulumu ve Sorgu Örnekleri]]></title>
            <link>https://medium.com/@ozermerve/northwind-veritaban%C4%B1-kurulumu-ve-sorgu-%C3%B6rnekleri-8e90b16351df?source=rss-785e589bf8ad------2</link>
            <guid isPermaLink="false">https://medium.com/p/8e90b16351df</guid>
            <category><![CDATA[northwind]]></category>
            <category><![CDATA[sql]]></category>
            <category><![CDATA[mssql]]></category>
            <category><![CDATA[sorgu]]></category>
            <category><![CDATA[subquery]]></category>
            <dc:creator><![CDATA[Merve Dumlubınar]]></dc:creator>
            <pubDate>Sun, 08 Aug 2021 19:03:57 GMT</pubDate>
            <atom:updated>2021-08-08T19:03:57.337Z</atom:updated>
            <content:encoded><![CDATA[<p>Bu yazıda <strong>Northwind</strong> veritabanı üzerinden çalıştırabileceğin kolay-orta seviye sorgu örnekleri bulacaksın. Sorgulara başlamadan önce veritabanının MS-SQL’e kurulumunu nasıl yapacağına bakalım. Öncelikle <a href="https://drive.google.com/file/d/1yR9AQiBwqma2sn1VwuVrxxJO6jVYlDlF/view?usp=sharing">buradan</a> Northwind.bak dosyasını indirmen gerekiyor. Dosyayı indirdikten sonra C: dizinine taşıman lazım. Daha sonra sırasıyla aşağıdaki adımları takip etmelisin.</p><ol><li>MS-SQL’i açtığında “Object Explorer” sekmesinden Database&gt;Restore Database sekmesine tıkla.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/419/1*86y7p44YVJ8_dCJxEVFPBQ.jpeg" /></figure><p><strong>2)</strong> Açılan ekranda default olarak Database: seçeneği seçili geliyor. Device’ı işaretle ve sağındaki üç noktaya tıkla.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/959/1*XuzoLOxfVlhI4TBirjqYIw.jpeg" /></figure><p><strong>3)</strong> Select backup devices ekranından Add dedikten sonra dosyanı seçeceksin. Ben direkt C’ye kopyalamıştım. O yüzden en üstteki C:’ ya bastığımda sağda çıktı. Farklı bir klasör açtıysan o klasörün içine girerek dosyanı seçmelisin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/771/1*Z1g-1ENoZcS9fN4r4yoU4w.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/723/1*6zxM06Nh--U9oJiaL4lorA.jpeg" /></figure><p><strong>4)</strong> Bundan sonrasında OK diyerek kurulumu başlatabilirsin. Kurulum bittiğinde başarılı bir şekilde kurulduğunu belirtiyor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/583/1*wZbHKLID28wQbZpRi8avXA.jpeg" /></figure><p><strong>5)</strong> “Database ‘NORTHWIND’ restored successfully” bildirimini gördüysen Object Explorer’ı yenilediğinde databasein oluştuğunu göreceksin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/279/1*-a_VnBab5sIcSwqDq9MQaA.jpeg" /></figure><p>Sorgulara başlamadan önce soruların hepsini sırayla yazacağım. Eğer SQL ile ilgili temel düzeyde bilgin var ama pratik yapmak istiyorsan sana tavsiyem sorguları sadece gözle incelemektense önce kendin yazmaya çalışıp daha sonra benim yazdıklarımı okuman. Çünkü bu iş biraz matematik öğrenmek gibi. Soruyu önce kendin çözmeye uğraşmadan direkt cevabı incelersen “Öğretmen anlattığında anlıyorum ama kendim çözemiyorum” klasiğine düşmüş olursun. Bunu yaşamamak adına tüm sorguları kolay, zor demeden önce senin yazman çok daha etkili olacak.</p><p><strong>1)</strong> Employees tablosundaki toplam çalışan sayısı kaçtır?</p><p><strong>2)</strong> Ünvanı ‘Dr.’ olan kayıtları kolon adı ‘Manager’ olacak şekilde getirin.</p><p><strong>3)</strong> Kadın çalışanları listeleyin.</p><p><strong>4)</strong> Erkek çalışanları listeleyin.</p><p><strong>5)</strong> Kaç kadın çalışan vardır?</p><p><strong>6)</strong> Çalışanların kaç farklı şehri var?</p><p><strong>7)</strong> Adresinde ‘House’ ifadesi geçen çalışanları listeleyin.</p><p><strong>8)</strong> Extension değeri 3 haneli olan çalışanların ad, soyad ve extension kolonlarını listeleyin.</p><p><strong>9)</strong> Çalışanların yaşlarını listeleyin.</p><p><strong>10)</strong> Ürünlerin isimlerini, fiyatlarını ve KDV’li fiyatlarını listeleyin.</p><p><strong>11)</strong> KDV’si 10 liradan düşük olan ürünleri listeleyin.</p><p><strong>12)</strong> En pahalı beş ürünü ürün fiyatına göre listeleyin.</p><p><strong>13)</strong> En ucuz beş ürünün fiyat ortalaması nedir?</p><p><strong>14)</strong> Stok sayısı 20’den çok 50’den az olan ürünleri listeleyin.</p><p><strong>15)</strong> En pahalı ürünün adı nedir?</p><p><strong>16)</strong> Kaç farklı çeşit kategori tipi var?</p><p><strong>17)</strong> Ülkelere ait müşteri sayısı nedir?</p><p><strong>18)</strong> Kategorilere ait ürün sayısı nedir?</p><p><strong>19)</strong> Her çalışanın yaptığı satış miktarını listeleyin. (3 Tablo joinlemeye ihtiyacın var)</p><p><strong>20)</strong> Her bir siparişin işletmeye getirdiği kazancı listeleyin. (Bir siparişte satılan ürünün fiyatı 10 TL ve satış adedi 15 adet ise toplam kazanç 10 * 15 = 150 TL olacaktır)</p><p><strong>21)</strong> 50’den fazla satış yapan çalışanları listeleyin.</p><p><strong>22)</strong> Müşteri adı en uzun olan müşteriyi ve adının karakter sayısını listeleyin.</p><p><strong>23)</strong> Hangi üründen kaç adet satılmış?</p><p><strong>24)</strong> Ortalama fiyatın altında kalan ürünler hangileridir?</p><p><strong>25)</strong> Kategori adı ‘Beverages’ olan ürünleri listeleyin.</p><ol><li>Employees tablosundaki toplam çalışan sayısı kaçtır?</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jv_TzptV5I8jbo_ujhvk5A.jpeg" /><figcaption>Öncelikle Employees tablosunun tamamına bakalım.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/473/1*Kw9xBtum14O9A4ora5ObQQ.png" /><figcaption>1. soru için yazılması gereken sorgu üstte ve aşağıda sorgu sonucu.</figcaption></figure><p>2. Ünvanı ‘Dr.’ olan kayıtları kolon adı ‘Manager’ olacak şekilde getirin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/726/1*nSIJ50EZ8Zhkv20XhAlp7A.jpeg" /></figure><p>3. Kadın çalışanları listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*katyKmfZxsBuZJtoRvl5Tw.jpeg" /><figcaption>Bu sonuç için iki farklı sorgu yazabilirsin. İkisi de aynı sonucu dönecektir.</figcaption></figure><p>4. Erkek çalışanları listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/627/1*cgS0lP6gjsg3YDsUK2jXkQ.jpeg" /></figure><p>5. Kaç kadın çalışan vardır?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/776/1*g-NNJcZKyH3qIW8qg4FXSg.jpeg" /></figure><p>6. Çalışanların kaç farklı şehri vardır?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/857/1*I6Y4O3Ncj_SKC6bGg6YceA.jpeg" /><figcaption>Bu sorguda sub-query kullanılabilir. Önce içteki sorgunun bize nasıl bir tablo döndüğüne bakalım. Bu sorgu Employees tablosundaki şehirleri tekrar etmeden (DISTINCT komutu bu işe yarıyordu) listeliyor.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/861/1*iDVqml423OsxDjr6bAt0Bg.jpeg" /><figcaption>Sorgunun tamamı çalıştığında ise içteki şehirleri listeleyen tablonun eleman sayısını veriyor. Yani çalışanların şehir sayısını.</figcaption></figure><p>7. Adresinde ‘House’ ifadesi geçen çalışanları listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/888/1*lisFlQoSpmvVrxKDhfbuog.jpeg" /><figcaption>LIKE komutu aramalarımızı belli karakterlere göre yapmamızı sağlıyor.<strong> LIKE “%House%”</strong> ifadesiyle öncesi ve sonrası önemli değil House ifadesi geçen satırları getir demiş olduk. Adresi A ile başlayanları isteseydik <strong>“LIKE A%“</strong> şeklinde bir ifade kullanacaktık. Baş harfi “A” olsun gerisi önemli değil demiş oluyoruz.</figcaption></figure><p>8. Extension değeri 3 haneli olan çalışanların ad, soyad ve extension kolonlarını listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/657/1*wnUxbfWxfZW9rTnnmwZ5Vw.jpeg" /><figcaption>Her iki sorgu da aynı sonucu veriyor ancak alttaki çok daha kullanışlı elbette. 3 basamaklı değil de 10 basamaklı değerler istenseydi BETWEEN komutu ile zor olacağı ortada. <strong>LEN </strong>komutu ile istediğimiz kolondaki değerlerin karakter uzunluğunu alabiliyoruz.</figcaption></figure><p>9. Çalışanların yaşlarını listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/762/1*y6LOWIHsIB9e-aQjNejhwg.jpeg" /><figcaption>DATEDIFF fonksiyonu ile iki tarih arasındaki farkı (yıl, ay, gün şeklinde) hesaplayabiliriz. DATEDIFF(süre birimi (ay mı? yıl mı?), hesaplanacak tarihin başlangıcı, bitişi).</figcaption></figure><p>10. Ürünlerin isimlerini, fiyatlarını ve KDV’li fiyatlarını listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/708/1*8pS8n53vixJYPwWcUXIHjg.jpeg" /></figure><p>11. KDV’si 10 liradan düşük olan ürünleri listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/753/1*AtjSds4odgli_NEY1IHYeg.jpeg" /></figure><p>12. En pahalı beş ürünü ürün fiyatına göre listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/564/1*nvv1dlFwscqesAbZjdVhow.jpeg" /></figure><p>13. En ucuz beş ürünün fiyat ortalaması nedir?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/431/1*RY8KQBtxSCEic9hNLTst0g.jpeg" /><figcaption>Yine bir sub-query örneği. İç sorgu çalıştırıldığında bu tablonun bize en ucuz beş ürünün fiyatını getirdiğini görüyoruz.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/439/1*NVEBat52y5c_Fy1Rr4gXHw.jpeg" /><figcaption>AVG fonksiyonu ile de içteki sorgudan gelen tablonun UnitPrice kolonunun ortalamasını almış olduk.</figcaption></figure><p>14. Stok sayısı 20’den çok 50’den az olan ürünleri listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/788/1*rLWqnruiD7m6R3LAwB2Veg.jpeg" /><figcaption>BETWEEN komutu.</figcaption></figure><p>15. En pahalı ürünün adı nedir?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/737/1*CA91c_F__vFkVjArRqE_Kw.jpeg" /></figure><p>16. Kaç farklı çeşit kategori tipi var?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/717/1*TSC53nn2aUkpIYzCheeeRQ.jpeg" /></figure><p>17. Ülkelere ait müşteri sayısı nedir?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/682/1*1rxVSJdDMDWKxklO7IcKMQ.jpeg" /></figure><p>18. Kategorilere ait ürün sayısı nedir?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/851/1*2HZDDWh3yxyMxJnvTaAU4A.jpeg" /><figcaption>INNER JOIN yapısı.</figcaption></figure><p>19. Her çalışanın yaptığı satış miktarını listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/699/1*tAXxKP33oDp_aGxZfGqChQ.jpeg" /></figure><p>20. Her bir siparişin işletmeye getirdiği kazancı listeleyin. (Bir siparişte satılan ürünün fiyatı 10 TL ve satış adedi 15 adet ise toplam kazanç 10 * 15 = 150 TL olacaktır)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/751/1*OjkLvI88PD7Jt4HUPiEKCA.jpeg" /></figure><p>21. 50’den fazla satış yapan çalışanları listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/505/1*H8tB7VYSQ3rFBEPNuLDEyg.jpeg" /></figure><p>22. Müşteri adı en uzun olan müşteriyi ve adının karakter sayısını listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/1*ioJmPdobu3YyI3Vt11OXew.jpeg" /><figcaption>İç sorgu çalıştırıldığında her bir müşterinin adının uzunluğunu veriyor.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/732/1*NP95C_9sZDifHjaFsz6FJQ.jpeg" /><figcaption>İç sorgudan dönen tabloya TOP 1 ve ORDER BY DESC dediğimizde en uzun değeri almış oluyoruz.</figcaption></figure><p>23. Hangi üründen kaç adet satılmış?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/453/1*gneOc6Rhas48jLN5Mott8g.jpeg" /></figure><p>24. Ortalama fiyatın altında kalan ürünler hangileridir?</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/886/1*eGro_lF_BcWeQV_x7evCxw.jpeg" /></figure><p>25. Kategori adı ‘Beverages’ olan ürünleri listeleyin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1001/1*OgKGHHUpbFQO6xbBUUQHLA.jpeg" /></figure><p>Kaynaklar:</p><ol><li>SQL Server’da Northwind Sorgusu Örnekleri. Yavuz Selim KART. <a href="https://www.youtube.com/watch?v=kOI4n4j7uuw&amp;list=PLiXHPMfTR_eXNzDaOwMnz0i9jAUXjzsjh">https://www.youtube.com/watch?v=kOI4n4j7uuw&amp;list=PLiXHPMfTR_eXNzDaOwMnz0i9jAUXjzsjh</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8e90b16351df" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Veritabanında Normalizasyon Kuralları Nedir? Ne İşe Yarar?]]></title>
            <link>https://medium.com/@ozermerve/veri%CC%87tabaninda-normali%CC%87zasyon-kurallari-nedi%CC%87r-ne-i%CC%87%C5%9Fe-yarar-3f26e0a94378?source=rss-785e589bf8ad------2</link>
            <guid isPermaLink="false">https://medium.com/p/3f26e0a94378</guid>
            <category><![CDATA[birinci-normal-form]]></category>
            <category><![CDATA[veritabanı]]></category>
            <category><![CDATA[normal-formlar]]></category>
            <category><![CDATA[sql]]></category>
            <category><![CDATA[normalizasyon]]></category>
            <dc:creator><![CDATA[Merve Dumlubınar]]></dc:creator>
            <pubDate>Thu, 29 Jul 2021 14:12:43 GMT</pubDate>
            <atom:updated>2021-07-31T11:56:18.007Z</atom:updated>
            <content:encoded><![CDATA[<p>Aslında bu yazı bazı SQL komutlarının kullanımını, birkaç subquery ve join örneklerini konu edinecekti fakat sadece bunlardan bahsetmenin yetersiz kalacağını fark ettim. Çünkü tabloların yapısını anlamadan, normalizasyon kurallarını incelemeden “ezbere” sorgu çekmenin kimseye bir faydası olmayacağını düşünüyorum. Bu yüzden bu yazıda bir veritabanı kurgusundaki temel hedefleri, yanlış kurgulanmış tabloların nasıl sorunlara yol açabileceği, normalizasyon kurallarının ilk üçünü açıklamaya çalışacağım. Bir sonraki yazıda ise Microsoft’un meşhur Northwind veritabanıyla ilgili sorgu örnekleri bulacaksın.</p><p>Normalizasyon kurallarına göre bir veritabanı kurgulamaya çalışırken <strong>ilk hedefimiz tekrarlı verilerin önüne geçmek.</strong> Tekrarlı verinin ne olduğunu bir tablo üzerinden inceleyelim.</p><figure><img alt="Normal formlar, normalizasyon" src="https://cdn-images-1.medium.com/max/370/1*Si8f-2b2fkYLMbddz1UjzA.jpeg" /></figure><p>Tabloyu incelediğimizde ders seçimi yapan öğrencilerin ad-soyad, bölüm, sınıf ve seçtikleri ders bilgilerini görüyoruz. İlk bakışta göze çarpan sıkıntı ise Tesla’nın birden fazla ders seçmesi sonucu ilk üç kolonun gereksiz tekrar etmesi. <strong>İki değil de 10 ders seçmiş olsaydı bu bilgileri on kez mi tekrarlayacaktık?</strong> İşte ilk hedefimiz bu tarz tekrarları engellemek. Böylece <strong>veritabanının fiziksel maliyetini</strong> de azaltmış olacağız.</p><p>Tekrarları ortadan kaldırdıktan sonra ikinci aşamada<strong> iyi yapılandırılmış ilişkiler</strong> kurmayı hedefliyoruz. Aslında elindeki tüm bilgileri bir tabloya yazıp yanlış da olsa sadece bir tablo ile işini görebilirsin. İlk tabloda tekrarlı veriler olsa da kimin hangi dersi aldığını görebiliyorsun. Tekrarların ya da hem öğrenci bilgilerinin hem ders bilgilerinin tek tabloda olmasının kimseye bir zararı yok gibi görünüyor. O halde şöyle bir senaryodaki <strong>veri kaybımızı</strong> düşün. Freud aniden “Analitik Psikoloji” dersini almaktan vazgeçiyor. Bu durumda Freud’un olduğu satırın silinmesi gerekmekte çünkü bu bilgiye artık ihtiyacımız yok. Ancak o satırı sildiğimizde sadece öğrenciye ait bilgileri değil ders bilgisini de silmiş olacağız. Sonuç olarak o ders gerçekten verilmiyor mu yoksa tercih eden kimse mi olmadı sorularının cevaplarına asla ulaşamayacağız. Bu gibi problemlere <strong>“Veritabanı Anomalileri” </strong>deniyor. Ve Freud’un senaryosu bir <strong>“Silme Anomalisi”</strong> örneğidir. Benzer olarak <strong>ekleme ve güncelleme anomalileri</strong> de var ve hepsi kolonlar arası ilişkilerin iyi yapılandırılmamış olmasından kaynaklanıyor.</p><p>Bu sorunların önüne geçmek içinse <strong>normalizasyon kurallarına uygun tablolar kurgulamak gerekiyor.</strong> Normal form isimleri şu şekilde;</p><ol><li>1.Normal Form</li><li>2.Normal Form</li><li>3.Normal Form</li><li>Boyce-Codd Normal Form</li><li>4.Normal Form</li><li>5.Normal Form</li></ol><p><strong>BİRİNCİ NORMAL FORM</strong></p><figure><img alt="Birinci normal form" src="https://cdn-images-1.medium.com/max/555/1*BfI9tXXPLN6M8u_T2Uk7YQ.jpeg" /><figcaption>Normal formların anlatımını bu tablo üzerinden yapacağız. Tablomuzun ilk hali bu şekilde.</figcaption></figure><p>Tablo incelendiğinde müşteri bilgileri ve ürün bilgilerinin tutulduğunu görüyoruz. Birinci normal forma göre <strong>hücreler içinde sadece bir veri tutulmalıdır.</strong> Yani virgülle ayırarak yazmış olduğumuz Urun kolonundaki veriler ilk sorunumuz. Ayrıca Sirket ve SirketTel kolonlarındaki <strong>“İkisi de”</strong> ifadesinin de hatalı olduğu son derece açık çünkü ilerleyen zamanlarda veritabanına yeni şirketler eklense elimizde sadece “Hangi ikisi?” sorusu kalacak. Son olarak <strong>her bir satırı tek başına tanımlayabilecek eşsiz bir kolonun</strong> da olmadığını görüyoruz. O halde bu üç kurala uyarak tablomuzu ilk normal forma uygun hale getirelim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/579/1*mkRDJqgyM2JxGqQaSR4r3A.jpeg" /><figcaption>Birinci normal forma göre düzenlenen tablo.</figcaption></figure><p><strong>İKİNCİ NORMAL FORM</strong></p><p>Tabloyu ikinci normal forma uygun hale getirmek için <strong>öncelikle birinci normal forma uyuyor olması gerekiyor </strong>ki tablomuz son haliyle buna uygun. Bu aşamaya kadar tekrarları engellemiş, tabloya bir adet Primary Key (PK) atamıştık. Şimdiyse tablodaki <strong>kolonları</strong> mantıksal olarak <strong>gruplandıracağız</strong>. Bu gruplandırma için tablodaki <strong>her kolonun PK (MusteriID) ile ilişkisi </strong>olması gerekiyor. Bu durumda tabloya döndüğümüzde MusteriAdi ve MusteriAdresi kolonlarının doğrudan müşteriyle ilişkili olduğu ve MusteriID’ye göbekten bağlı olduğu görülüyor. Ancak Urun, Sirket, SirketTel ve Fiyat kolonlarının bir <strong>müşteri tanımıyla ilgisi yoktur.</strong> Bu da bize <strong>tablonun ikiye bölünmesi</strong> gerektiğini ve <strong>tabloların birinde müşteri bilgilerinin</strong>, <strong>ötekisinde ise ürün bilgilerinin</strong> tutulması gerektiğini söylüyor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/275/1*O-bLy45jmN6BDCiuBRo0WQ.jpeg" /><figcaption>Müşteriler tablosu.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/379/1*PVsU1rl4FfeYgomJMjXxAg.jpeg" /><figcaption>Ürünler tablosu.</figcaption></figure><p><strong>ÜÇÜNCÜ NORMAL FORM</strong></p><p>Üçüncü normal forma geldiğimizdeyse incelenmesi gereken nokta <strong>tabloda gerçekten de sadece bir tane PK olabilecek kolonun olması.</strong> Önce müşteriler tablosuna bakalım. MusteriID kolonu, MusteriAdi ve MusteriAdresi kolonlarını tek başına tanımlayabilecek özellikte. <strong>Yani her müşterinin MusteriID’si o müşteriye özel</strong> olduğu için -Tıpkı T.C. Kimlik Numarası gibi- MusteriID kolonunu ayırt edici kolon yani PK olarak kullanabiliriz. Müşteriler tablosunda üçüncü normal form için yanlış bir durum yok gibi görünüyor. Öte yandan Ürünler tablosuna baktığımızda UrunId kolonunun tıpkı MusteriID gibi her bir ürünü tek başına tanımlayabileceğini görüyoruz ancak Sirket ve SirketTel kolonları arasında garip bir ilişki söz konusu. Şöyle ki <strong>eğer şirketin ismini biliyorsak telefon numarasına ya da numarayı biliyorsak şirket ismine ulaşabiliyoruz.</strong> Bu durumda tabloda <strong>UrunId’ye ihtiyaç duymadan birbirini tanımlayabilen</strong> kolonlarımız olmuş oluyor. Oysa tablomuzda <strong>yalnızca bir adet PK</strong> olmalıydı. Bu şartı yerine getirebilmek için ürünler tablomuzu da bölmemiz gerekiyor. Sirket ve SirketTel kolonlarından oluşan ayrı bir şirketler tablosu veritabanımızı üçüncü normal forma uygun hale getirecek. Bu tabloyu oluşturduktan sonra ise Ürünler tablosundan SirketTel kolonunu sileceğiz çünkü bu bilgi şirketler tablosunda tutuluyor olacak. İhtiyaç dahilinde<strong> join </strong>işlemi yaparak telefon numarası bilgisine erişebiliriz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/252/1*-eiPPk0Ssiovy1Nt7khWng.png" /><figcaption>Şirketler tablosu.</figcaption></figure><p>Sonuç olarak elimizde üç adet tablomuz oldu. Bunu yaparken ilk tablodaki kolonları mantıksal olarak gruplandırdık. Yeni oluşan her tabloya bir adet PK atadık. Verilerin tekrarını engelledik.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/275/1*O-bLy45jmN6BDCiuBRo0WQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/309/1*MUKMSTFtxMJfwzeTZ9aIiA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/252/1*-eiPPk0Ssiovy1Nt7khWng.png" /></figure><p>Umarım anlaşılır bir yazı olmuştur. Düzeltilmesi gereken noktalar varsa yorumlarda bildirmeniz beni çok mutlu eder.</p><p>Kaynaklar</p><ol><li>Şadi Evren ŞEKER. Veri Tabanları Eğitim Serisi. <a href="https://www.youtube.com/watch?v=pHKZw5EyTi4&amp;list=PLh9ECzBB8tJOS7WQKdeUaAa5fmPLYAouD">https://www.youtube.com/watch?v=pHKZw5EyTi4&amp;list=PLh9ECzBB8tJOS7WQKdeUaAa5fmPLYAouD</a></li><li>Geeks For Geeks. Normal Forms in DBMS. <a href="https://www.geeksforgeeks.org/normal-forms-in-dbms/">https://www.geeksforgeeks.org/normal-forms-in-dbms/</a></li><li>M.Mutlu YAPICI. Veritabanı ve Yönetim Sistemleri. <a href="https://acikders.ankara.edu.tr/pluginfile.php/59400/mod_resource/content/0/Veritaban%C4%B1%20ve%20Y%C3%B6netim%20Sistemleri%20Sunum%202.pdf">https://acikders.ankara.edu.tr/pluginfile.php/59400/mod_resource/content/0/Veritaban%C4%B1%20ve%20Y%C3%B6netim%20Sistemleri%20Sunum%202.pdf</a></li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3f26e0a94378" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>