<?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 Sonal Gupta on Medium]]></title>
        <description><![CDATA[Stories by Sonal Gupta on Medium]]></description>
        <link>https://medium.com/@sonalgupta276?source=rss-1932c07c3611------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*ctxhU9vhxEvH02o3.</url>
            <title>Stories by Sonal Gupta on Medium</title>
            <link>https://medium.com/@sonalgupta276?source=rss-1932c07c3611------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 25 Jun 2026 09:29:25 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@sonalgupta276/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[Debugging My Health Like I Debug Code]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-snippet">As a software developer, I&#x2019;ve spent years debugging systems&#x200A;&#x2014;&#x200A;tracing issues, isolating variables, and fixing what&#x2019;s broken.</p><p class="medium-feed-link"><a href="https://sonalgupta276.medium.com/debugging-my-health-like-i-debug-code-865c0b07f7c7?source=rss-1932c07c3611------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://sonalgupta276.medium.com/debugging-my-health-like-i-debug-code-865c0b07f7c7?source=rss-1932c07c3611------2</link>
            <guid isPermaLink="false">https://medium.com/p/865c0b07f7c7</guid>
            <dc:creator><![CDATA[Sonal Gupta]]></dc:creator>
            <pubDate>Tue, 31 Mar 2026 06:11:48 GMT</pubDate>
            <atom:updated>2026-03-31T06:11:48.375Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[8 Important Array Functions Every JavaScript Developer Must Know]]></title>
            <link>https://medium.com/swlh/8-important-array-functions-every-javascript-developer-must-know-a0858f2c4b14?source=rss-1932c07c3611------2</link>
            <guid isPermaLink="false">https://medium.com/p/a0858f2c4b14</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[learning]]></category>
            <category><![CDATA[arrays]]></category>
            <dc:creator><![CDATA[Sonal Gupta]]></dc:creator>
            <pubDate>Thu, 13 Aug 2020 14:08:51 GMT</pubDate>
            <atom:updated>2020-08-18T21:23:13.728Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wfQen58fJp_9Tl3-o7l1pA.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@fatosi?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Fatos Bytyqi</a> on <a href="https://unsplash.com/s/photos/programming?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>Arrays are list-like objects whose prototype has methods to perform traversal and mutation operations. Neither the length of a JavaScript array nor the types of its elements are fixed. Since an array’s length can change at any time, and data can be stored at non-contiguous locations in the array, JavaScript arrays are not guaranteed to be dense; this depends on how the programmer chooses to use them.</p><p><strong>Following are the important JavaScript Array Functions</strong></p><h3>1. Array.prototype.map()</h3><p>The <strong>map()</strong> method <strong>creates a new array</strong> populated with the results of calling a provided function on every element in the calling array.</p><pre>const array1 = [1, 4, 9, 16];</pre><pre>// pass a function to map<br>const map1 = array1.map(x =&gt; x * 2);</pre><pre>console.log(map1);<br>// expected output: Array [2, 8, 18, 32]</pre><h3>2. Array.prototype.find()</h3><p>The <strong>find()</strong> method returns the <strong>value</strong> of the <strong>first element</strong> in the provided array that satisfies the provided testing function.</p><pre>const array1 = [5, 12, 8, 130, 44];</pre><pre>const found = array1.find(element =&gt; element &gt; 10);</pre><pre>console.log(found);<br>// expected output: 12</pre><h3>3. Array.prototype.findIndex()</h3><p>The <strong>findIndex()</strong> method returns the <strong>index</strong> of the first element in the array <strong>that satisfies the provided testing function</strong>. Otherwise, it returns -1, indicating that no element passed the test.</p><pre>const array1 = [5, 12, 8, 130, 44];</pre><pre>const isLargeNumber = (element) =&gt; element &gt; 13;</pre><pre>console.log(array1.findIndex(isLargeNumber));<br>// expected output: 3</pre><h3>4. Array.prototype.filter()</h3><p>The <strong>filter()</strong> method <strong>creates a new array</strong> with all elements that pass the test implemented by the provided function.</p><pre>const words = [&#39;spray&#39;, &#39;limit&#39;, &#39;elite&#39;, &#39;exuberant&#39;, &#39;destruction&#39;, &#39;present&#39;];</pre><pre>const result = words.filter(word =&gt; word.length &gt; 6);</pre><pre>console.log(result);<br>// expected output: Array [&quot;exuberant&quot;, &quot;destruction&quot;, &quot;present&quot;]</pre><h3>5. Array.prototype.reduce()</h3><p>The <strong>reduce()</strong> method executes a <strong>reducer</strong> function (that you provide) on each element of the array, resulting in single output value.</p><pre>const array1 = [1, 2, 3, 4];<br>const reducer = (accumulator, currentValue) =&gt; accumulator + currentValue;</pre><pre>// 1 + 2 + 3 + 4<br>console.log(array1.reduce(reducer));<br>// expected output: 10</pre><pre>// 5 + 1 + 2 + 3 + 4<br>console.log(array1.reduce(reducer, 5));<br>// expected output: 15</pre><p>The <strong>reducer</strong> function takes four arguments:</p><ol><li>Accumulator (acc)</li><li>Current Value (cur)</li><li>Current Index (idx)</li><li>Source Array (src)</li></ol><p>Your <strong>reducer</strong> function’s returned value is assigned to the accumulator, whose value is remembered across each iteration throughout the array, and ultimately becomes the final, single resulting value.</p><h3>6. Array.prototype.concat()</h3><p>The <strong>concat()</strong> method is used to merge two or more arrays. This method does not change the existing arrays, but instead returns a new array.</p><pre>const array1 = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];<br>const array2 = [&#39;d&#39;, &#39;e&#39;, &#39;f&#39;];<br>const array3 = array1.concat(array2);</pre><pre>console.log(array3);<br>// expected output: Array [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;, &quot;f&quot;]</pre><h3>7. Array.prototype.slice()</h3><p>The <strong>slice()</strong> method returns a shallow copy of a portion of an array into a new array object selected from start to end (end not included) where start and end represent the index of items in that array. The original array will not be modified.</p><pre>const animals = [&#39;ant&#39;, &#39;bison&#39;, &#39;camel&#39;, &#39;duck&#39;, &#39;elephant&#39;];</pre><pre>console.log(animals.slice(2));<br>// expected output: Array [&quot;camel&quot;, &quot;duck&quot;, &quot;elephant&quot;]</pre><pre>console.log(animals.slice(2, 4));<br>// expected output: Array [&quot;camel&quot;, &quot;duck&quot;]</pre><pre>console.log(animals.slice(1, 5));<br>// expected output: Array [&quot;bison&quot;, &quot;camel&quot;, &quot;duck&quot;, &quot;elephant&quot;]</pre><h3>8. Array.prototype.splice()</h3><p>The <strong>splice()</strong> method changes the contents of an array by removing or replacing existing elements and/or adding new elements <a href="https://en.wikipedia.org/wiki/In-place_algorithm">in place</a>.</p><pre>const months = [&#39;Jan&#39;, &#39;March&#39;, &#39;April&#39;, &#39;June&#39;];</pre><pre>months.splice(1, 0, &#39;Feb&#39;);<br>// inserts at index 1</pre><pre>console.log(months);<br>// expected output: Array [&quot;Jan&quot;, &quot;Feb&quot;, &quot;March&quot;, &quot;April&quot;, &quot;June&quot;]</pre><pre>months.splice(4, 1, &#39;May&#39;);<br>// replaces 1 element at index 4</pre><pre>console.log(months);<br>// expected output: Array [&quot;Jan&quot;, &quot;Feb&quot;, &quot;March&quot;, &quot;April&quot;, &quot;May&quot;]</pre><h4>Syntax</h4><pre>let arrDeletedItems = array.splice(start[, deleteCount[, item1[, item2[, ...]]]])</pre><h4>Parameters</h4><p>startThe index at which to start changing the array.</p><p>deleteCount | Optional — An integer indicating the number of elements in the array to remove from start. If deleteCount is 0 or negative, no elements are removed. In this case, you should specify at least one new element</p><p>item1, item2, ...| Optional — The elements to add to the array, beginning from start. If you do not specify any elements, splice() will only remove elements from the array.</p><h4>Return value</h4><p>An array containing the deleted elements. If only one element is removed, an array of one element is returned. If no elements are removed, an empty array is returned.</p><blockquote>Note — If the specified number of elements to insert differs from the number of elements being removed, the array’s length will be changed.</blockquote><p><strong>Let’s deep dive to understand </strong><strong>splice() method better —</strong></p><h4>1. Remove 0 (zero) elements before index 2, and insert “drum”</h4><pre>let myFish = [&#39;angel&#39;, &#39;clown&#39;, &#39;mandarin&#39;, &#39;sturgeon&#39;]<br>let removed = myFish.splice(2, 0, &#39;drum&#39;)</pre><pre><strong>// myFish is [&quot;angel&quot;, &quot;clown&quot;, &quot;drum&quot;, &quot;mandarin&quot;, &quot;sturgeon&quot;] <br>// removed is [], no elements removed</strong></pre><h4>2. Remove 0 (zero) elements before index 2, and insert “drum” and “guitar”</h4><pre>let myFish = [&#39;angel&#39;, &#39;clown&#39;, &#39;mandarin&#39;, &#39;sturgeon&#39;]<br>let removed = myFish.splice(2, 0, &#39;drum&#39;, &#39;guitar&#39;)</pre><pre>// myFish is [&quot;angel&quot;, &quot;clown&quot;, &quot;drum&quot;, &quot;guitar&quot;, &quot;mandarin&quot;, &quot;sturgeon&quot;] <br>// removed is [], no elements removed</pre><h4>3. Remove 1 element at index 3</h4><pre>let myFish = [&#39;angel&#39;, &#39;clown&#39;, &#39;drum&#39;, &#39;mandarin&#39;, &#39;sturgeon&#39;]<br>let removed = myFish.splice(3, 1)</pre><pre>// myFish is [&quot;angel&quot;, &quot;clown&quot;, &quot;drum&quot;, &quot;sturgeon&quot;]<br>// removed is [&quot;mandarin&quot;]</pre><h4>4. Remove 1 element at index 2, and insert “trumpet”</h4><pre>let myFish = [&#39;angel&#39;, &#39;clown&#39;, &#39;drum&#39;, &#39;sturgeon&#39;]<br>let removed = myFish.splice(2, 1, &#39;trumpet&#39;)</pre><pre>// myFish is [&quot;angel&quot;, &quot;clown&quot;, &quot;trumpet&quot;, &quot;sturgeon&quot;]<br>// removed is [&quot;drum&quot;]</pre><h4>5. Remove 2 elements from index 0, and insert “parrot”, “anemone” and “blue”</h4><pre>let myFish = [&#39;angel&#39;, &#39;clown&#39;, &#39;trumpet&#39;, &#39;sturgeon&#39;]<br>let removed = myFish.splice(0, 2, &#39;parrot&#39;, &#39;anemone&#39;, &#39;blue&#39;)</pre><pre>// myFish is [&quot;parrot&quot;, &quot;anemone&quot;, &quot;blue&quot;, &quot;trumpet&quot;, &quot;sturgeon&quot;] <br>// removed is [&quot;angel&quot;, &quot;clown&quot;]</pre><h4>6. Remove 2 elements from index 2</h4><pre>let myFish = [&#39;parrot&#39;, &#39;anemone&#39;, &#39;blue&#39;, &#39;trumpet&#39;, &#39;sturgeon&#39;]<br>let removed = myFish.splice(2, 2)</pre><pre>// myFish is [&quot;parrot&quot;, &quot;anemone&quot;, &quot;sturgeon&quot;] <br>// removed is [&quot;blue&quot;, &quot;trumpet&quot;]</pre><h4>7. Remove 1 element from index -2</h4><pre>let myFish = [&#39;angel&#39;, &#39;clown&#39;, &#39;mandarin&#39;, &#39;sturgeon&#39;]<br>let removed = myFish.splice(-2, 1)<br>// -ve index means start indexing from end of the array</pre><pre>// myFish is [&quot;angel&quot;, &quot;clown&quot;, &quot;sturgeon&quot;] <br>// removed is [&quot;mandarin&quot;]</pre><h4>8. Remove all elements from index 2</h4><pre>let myFish = [&#39;angel&#39;, &#39;clown&#39;, &#39;mandarin&#39;, &#39;sturgeon&#39;]<br>let removed = myFish.splice(2)</pre><pre>// myFish is [&quot;angel&quot;, &quot;clown&quot;]<br>// removed is [&quot;mandarin&quot;, &quot;sturgeon&quot;]</pre><p><strong>Hope these methods will be helpful for you to improve your code.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a0858f2c4b14" width="1" height="1" alt=""><hr><p><a href="https://medium.com/swlh/8-important-array-functions-every-javascript-developer-must-know-a0858f2c4b14">8 Important Array Functions Every JavaScript Developer Must Know</a> was originally published in <a href="https://medium.com/swlh">The Startup</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Using Fetch Vs Axios.Js for Making HTTP Requests]]></title>
            <link>https://medium.com/swlh/using-fetch-vs-axios-js-for-making-http-requests-90ba91767c06?source=rss-1932c07c3611------2</link>
            <guid isPermaLink="false">https://medium.com/p/90ba91767c06</guid>
            <category><![CDATA[api-development]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[api]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[tech]]></category>
            <dc:creator><![CDATA[Sonal Gupta]]></dc:creator>
            <pubDate>Sun, 19 Jul 2020 22:40:44 GMT</pubDate>
            <atom:updated>2020-07-20T15:32:57.247Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XxG9nCINfHEHv0df8Qhgdw.jpeg" /></figure><p>JavaScript can send network requests to the server and load new information whenever it’s needed. For example, we can use a network request to submit an order, load user information, receive the latest updates from the server, etc. …And all of that without reloading the page!</p><p>The Fetch API provides a <strong>fetch() method</strong> defined on the window object that provides an easy, logical way to fetch resources asynchronously across the network. It provides a JavaScript interface for accessing and manipulating parts of the HTTP pipeline (requests and responses).</p><p>A basic fetch request is really simple to set up. Have a look at the following code:</p><pre>fetch(’http://example.com/task.json’)<br>  .then(response =&gt; response.json())<br>  .then(data =&gt; console.log(data))</pre><p>The simplest use of fetch() takes one argument — the path to the resource you want to fetch — and returns a promise that resolves to the response to that request (successful or not). This is just an HTTP response, not the actual JSON. If you use fetch() there is a two-step process when handing JSON data. The first is to make the actual request and then the second is to call the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Body/json">json()</a> method on the response. You can optionally pass an init options object as second argument (used to configure req headers for other types of HTTP requests such as PUT, POST, DELETE)</p><h4>Difference between fetch() Vs jQuery.ajax()</h4><p>Fetch is similar to <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest">XMLHttpRequest</a>, but the new API provides a more powerful and flexible feature set. The fetch specification differs from jQuery.ajax() in these ways:</p><ul><li>The Promise returned from fetch() <strong>won’t reject HTTP error status</strong> even if the response is an HTTP 404 or 500. Instead, it will resolve normally (with ok status set to false), and it will only reject on network failure or if anything prevented the request from completing.</li><li>fetch <strong>won’t send cookies</strong>, unless you set the <em>credentials</em> init option.</li></ul><p><strong>Axios</strong> is a Javascript library used to make HTTP requests from node.js or XMLHttpRequests from the browser and it supports the Promise API that is native to JS ES6. It can be used to intercept HTTP requests and responses and enables client-side protection against XSRF. It also has the ability to cancel requests.</p><h4>Installation</h4><p>You need to install axios using:</p><pre>$ npm install axios</pre><p>Or a content delivery network</p><pre>&lt;script src=&quot;https://unpkg.com/axios/dist/axios.min.js&quot;&gt;&lt;/script&gt;</pre><p>An axios request is simple to set up. Have a look at the following code:</p><pre>axios.get(&#39;<a href="https://api.spotify.com/v1/artists/0OdUWJ0sBjDrqHygGUXeCF&#39;">https://api.tasks.com/v1/artists/0OdUWJ0sBjDrqHygGUX</a>&#39;)<br>  .then(function(response) {<br>       console.log(response)<br>  })<br>  .catch(function(error) {<br>       console.log(error)<br>  })</pre><p>So by using axios you can cut out the middle step of passing the results of the http request to the .json() method. Axios just returns the data object you would expect.</p><h4>Difference between fetch() Vs axios</h4><ul><li>Fetch API is built into the window object, and therefore doesn’t need to be installed as a dependency or imported in client-side code.</li><li>Axios needs to be installed as a dependency. However, it automatically transforms JSON data for you, thereby avoiding the two-step process of making a .fetch() request and then a second call to the .json() method on the response.</li><li>With Axios, any kind of error you get with the http request will be handled and the .catch() block is executed.</li><li>Axios allows <strong>cancelling request and request timeout </strong>while fetch does not.</li><li>Axios has <strong>wide browser support, </strong>where as<strong> </strong>Fetch only supports Chrome 42+, Firefox 39+, Edge 14+, and Safari 10.1+ (This is known as Backward Compatibilty).</li></ul><p>The fetch() method is modern and versatile for getting http requests native in ES6, but by using third party libraries like Axios certain scenarios can be better handled.</p><p>I hope you now have better idea about basic usage of fetch() Vs axios Vs jQuery.ajax(). If you still have any confusions, let me know in comments.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=90ba91767c06" width="1" height="1" alt=""><hr><p><a href="https://medium.com/swlh/using-fetch-vs-axios-js-for-making-http-requests-90ba91767c06">Using Fetch Vs Axios.Js for Making HTTP Requests</a> was originally published in <a href="https://medium.com/swlh">The Startup</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tableau: TDE Vs LIVE Connection]]></title>
            <link>https://sonalgupta276.medium.com/tableau-tde-vs-live-connection-c7dbd1e0afc0?source=rss-1932c07c3611------2</link>
            <guid isPermaLink="false">https://medium.com/p/c7dbd1e0afc0</guid>
            <category><![CDATA[data]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[tableau]]></category>
            <category><![CDATA[visualization]]></category>
            <category><![CDATA[bi]]></category>
            <dc:creator><![CDATA[Sonal Gupta]]></dc:creator>
            <pubDate>Sun, 24 May 2020 15:09:48 GMT</pubDate>
            <atom:updated>2020-05-24T16:06:34.779Z</atom:updated>
            <content:encoded><![CDATA[<p>This is the very beginning of my technical blog writing with Medium. In my first post, I have discussed Tableau because it’s been almost a year when I started using it. I would like to thank my mentor <a href="https://medium.com/u/21d4d6ce0f09">Milankmr</a> who encouraged me to pen down and share my learnings with you all. I hope you’ll enjoy it and will gain some insights from it.</p><p>If you’re getting started with Tableau — right after connecting your workbook to the data source, you should be able to figure out and understand whether you would need a Tableau Extract or a Live connection (at times both though !). In this post, I’ll be giving you insights about Extracts Vs Live — Which one you should use and why, and what are the pros and cons of both.</p><blockquote>So, Let’s get started!</blockquote><blockquote><strong>What are Extracts?</strong></blockquote><p>Extracts are one of the most powerful but overlooked tools in Tableau’s arsenal. Tableau Data Extracts (TDEs) are compressed snapshots of data optimized for aggregation and loaded into system memory to be quickly recalled for visualization, accordingly. So, the database isn’t required to build your viz.</p><p>A TDE is a columnar store which means it stores values together within a column rather than a row. By only reading in the relevant data (columns) necessary to answer the question, the input and output necessary to query and aggregate data is largely decreased. Therefore, extracts are often faster (but not always!). To understand more about how TDE’s design makes it ideal for supporting analytics and data discovery, you can go through the below blog to know it’s architecture: <a href="https://www.tableau.com/about/blog/2014/7/understanding-tableau-data-extracts-part1">https://www.tableau.com/about/blog/2014/7/understanding-tableau-data-extracts-part1</a></p><blockquote><strong>There are two options to refresh the data in the extract:</strong></blockquote><p><strong>Full Extracts</strong>: A full extract rewrites the existing data extract in Tableau data Engine with a new file from the Tableau data source</p><p><strong>Incremental Refresh</strong>: It will help to add new records that have been added since the last extract has been created. This can be particularly useful if your data extract is to be refreshed daily. You can do so by selecting the checkbox <strong><em>Incremental Refresh</em></strong> in the <strong><em>Extract Data</em></strong> Dialog box</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/728/1*2oJXkXvcRbvyFQONfadG2Q.png" /></figure><blockquote><strong>What is a LIVE connection ?</strong></blockquote><p>The data source that contains a direct connection to underlying data, relies on a database for all queries and undergoes real-time updates is a live connection.</p><blockquote><strong>How to identify if you have created a TDE or LIVE connection ?</strong></blockquote><p>Below are the symbols that are used to represent TDE and LIVE connection:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/820/1*_yVrpxLEnk3zxjlDzswO4A.png" /></figure><p>After you have selected your data source, and chosen one of the options from LIVE and Extract in your <em>Data Source </em>tab, you can find the data source name with a symbol of TDE or LIVE connection in the upper left corner of <em>Data</em> pane in your Tableau sheet. This symbol denotes the TDE and LIVE connection. I have also attached the snapshots to know where you can check for these symbols.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*30emdlbOnzAkaVcg" /><figcaption>Extract Connection</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*000WKpmJXjbrOZUx" /><figcaption>LIVE Connection</figcaption></figure><blockquote><strong>When to use Extract and LIVE ?</strong></blockquote><p>In addition to choosing the data source in Tableau, you need to decide whether you want to use live or static data. In other words, do you want your analysis and visualizations to be based on the most current data that’s available, or do you want to use an extract that provides a snapshot of the results based on criteria that you select?</p><p>Here I have listed — Pros and Cons of both TDE and LIVE which will help you decide the connection based upon your business requirements:</p><h3>Pros and Cons of TDE</h3><h4>Pros:</h4><ol><li><strong>Speeds up the workbook through optimization </strong>— Because extracts are embedded within the workbook, they’re faster when you have complex visualizations with large data sets, filters, calculations. Also, where Custom SQL slows down performance, TDE can speed up the performance.</li><li><strong>Offline </strong>— Your data source can be utilized when you’re offline and unable to connect to the data source. Eg: When you’re on a plane or in an area having a poor network connection, you can simply create an extract of your data and work on it if you don’t have a connection to your live data source.</li><li><strong>Privacy </strong>— By hiding certain fields within your data source and then creating an extract, you can hide the fields that aren’t used, thereby ensuring data can only be viewed by the people intended.</li><li><strong>Portability </strong>— A TDE can be bundled with Tableau visualizations in a packaged workbook for easy sharing and collaboration.</li><li><strong>Reduce Load</strong> — Replacing a live connection to an OLTP database, or any database with a TDE reduces the load on the database that can result from heavy Tableau user traffic.</li><li><strong>Filters</strong> — As you extract data into a Tableau Data Extract, you can begin the process of preparing your data for analysis. In the <strong>Extract</strong> options under <strong>Data</strong> &gt; <strong>Extract</strong>, you’ll be prompted to add<strong> Filters</strong> to your data extract. While the data source may be very large, you may not need the entire dataset to complete the analysis required. Filters can help pare down a very large data source into only the essential records, thus creating a streamlined data sub-set. Smaller data extracts require less computing power.</li></ol><p><strong>Cons:</strong></p><ol><li><strong>Snapshot:</strong> Because data is extracted from the data source, the data will remain the same unless it is refreshed.</li><li><strong>Size/Structure:</strong> Extracts can become slow to refresh and query depending on the data structure. E.g: many columns and structures</li></ol><h3>Pros and Cons of Live Connection</h3><p><strong>Pros:</strong></p><ol><li><strong>Real-time updates</strong> — As your viz is directly connected to the underlying data, this ensures data freshness.</li><li><strong>When you need up-to-the-minute data</strong> — If things are changing so fast that you need to see them in real-time, you need a live connection to your data. All your operational dashboards can be hooked up directly to live data so you know when your plant is facing overutilization or when you’re experiencing peak demand.</li></ol><p><strong>Cons:</strong></p><ol><li><strong>Databases are not always optimized for fast performance (unlike extracts) </strong>— As data queries go through the database, they can only as fast as the database itself. Accordingly, working with a live connection may be slow.</li><li><strong>Other factors can affect speed</strong> — e.g. Poor network speed and network traffic can slow down your workbook.</li><li><strong>Stress </strong>— Live connections, especially within complex workbooks, can stress some traditional databases.</li></ol><blockquote><strong>Below I have summarized some of the points that would help you to compare both :</strong></blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FThyFXr34LpUKGjf32olbw.png" /><figcaption>Comparison between a TDE and LIVE Connection</figcaption></figure><h3>So, now the question is :</h3><h3>Which of the two is best and which one to choose?</h3><h4>And, the answer is BOTH!</h4><p>Even better is when you don’t have to choose between in-memory and a live connection. Instead of looking for a solution that supports one or the other, look for one that supports choice. You should be able to switch back and forth between in-memory and live connections as needed.</p><ul><li>You want to use a sample of a massive data set to find trends and build your analysis. You bring a 5% sample of the data in-memory, explore it, and create a set of views you want to share. Then you switch to a live connection so your reports are working directly against all the data. Publish your views, and now your colleagues can interact with your analysis and drill down to the part of the data most relevant to their work.</li><li>You’re flying to New York and want to do some analysis on the plane. You bring your entire data set, several million rows, into your local PC memory, and work with it offline. When you get to New York, you reconnect to the live data again. You’ve done your analysis offline and in-memory, but you are able to switch back to a live connection with a few clicks.</li></ul><pre><strong><em>Because Tableau can now do analytics so swiftly and gives people the choice to connect directly to fast databases or use Tableau’s in-memory data engine, it has become much more powerful in respect of data exploration and data discovery. This leads to analytical insights that would most likely have been missed before.</em></strong></pre><pre><strong><em>— ROBIN BLOOR, Ph.D., FOUNDER OF THE BLOOR GROUP</em></strong></pre><blockquote><strong>Conclusion</strong></blockquote><p>With that I’ll say that it will majorly depend upon your business requirements for which kind of connection you’ll require after you develop your dashboard. With Tableau, you receive more options for deployment, data connections, and collaboration. Hence, you can always switch between your data connections to work according to the conditions prevailing around you which makes Tableau, the market leader in modern BI platforms, offering the greatest analytical breadth, depth, and flexibility.</p><p>I usually procrastinate a lot, but I promise I’ll post more stuff — tips, and tricks about Tableau in my upcoming Medium blogs. Till then keep reading! 😄</p><p>If you have any questions, you can ping me on my LinkedIn: <a href="https://www.linkedin.com/in/sonal-gupta-85169989/">https://www.linkedin.com/in/sonal-gupta-85169989/</a></p><p>I’ll be very much happy to answer any questions :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c7dbd1e0afc0" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>