Physical vs. logical / soft delete of database record?












94















What is the advantage of doing a logical/soft delete of a record (i.e. setting a flag stating that the record is deleted) as opposed to actually or physically deleting the record?



Is this common practice?



Is this secure?










share|improve this question




















  • 11





    Use delete timestamps, not flags.

    – Dave Jarvis
    Dec 19 '13 at 23:28











  • @DaveJarvis, can you explain why using timestamps is a better approach to flags?

    – C Henry
    Mar 13 at 3:22











  • A flag doesn't provide any information about when the row was deleted. Temporal information has many uses, including systems debugging.

    – Dave Jarvis
    Mar 13 at 4:04


















94















What is the advantage of doing a logical/soft delete of a record (i.e. setting a flag stating that the record is deleted) as opposed to actually or physically deleting the record?



Is this common practice?



Is this secure?










share|improve this question




















  • 11





    Use delete timestamps, not flags.

    – Dave Jarvis
    Dec 19 '13 at 23:28











  • @DaveJarvis, can you explain why using timestamps is a better approach to flags?

    – C Henry
    Mar 13 at 3:22











  • A flag doesn't provide any information about when the row was deleted. Temporal information has many uses, including systems debugging.

    – Dave Jarvis
    Mar 13 at 4:04
















94












94








94


38






What is the advantage of doing a logical/soft delete of a record (i.e. setting a flag stating that the record is deleted) as opposed to actually or physically deleting the record?



Is this common practice?



Is this secure?










share|improve this question
















What is the advantage of doing a logical/soft delete of a record (i.e. setting a flag stating that the record is deleted) as opposed to actually or physically deleting the record?



Is this common practice?



Is this secure?







sql database soft-delete






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jul 1 '15 at 18:28









Brian Tompsett - 汤莱恩

4,2421339102




4,2421339102










asked Dec 18 '08 at 16:09









user21826user21826

1,82132227




1,82132227








  • 11





    Use delete timestamps, not flags.

    – Dave Jarvis
    Dec 19 '13 at 23:28











  • @DaveJarvis, can you explain why using timestamps is a better approach to flags?

    – C Henry
    Mar 13 at 3:22











  • A flag doesn't provide any information about when the row was deleted. Temporal information has many uses, including systems debugging.

    – Dave Jarvis
    Mar 13 at 4:04
















  • 11





    Use delete timestamps, not flags.

    – Dave Jarvis
    Dec 19 '13 at 23:28











  • @DaveJarvis, can you explain why using timestamps is a better approach to flags?

    – C Henry
    Mar 13 at 3:22











  • A flag doesn't provide any information about when the row was deleted. Temporal information has many uses, including systems debugging.

    – Dave Jarvis
    Mar 13 at 4:04










11




11





Use delete timestamps, not flags.

– Dave Jarvis
Dec 19 '13 at 23:28





Use delete timestamps, not flags.

– Dave Jarvis
Dec 19 '13 at 23:28













@DaveJarvis, can you explain why using timestamps is a better approach to flags?

– C Henry
Mar 13 at 3:22





@DaveJarvis, can you explain why using timestamps is a better approach to flags?

– C Henry
Mar 13 at 3:22













A flag doesn't provide any information about when the row was deleted. Temporal information has many uses, including systems debugging.

– Dave Jarvis
Mar 13 at 4:04







A flag doesn't provide any information about when the row was deleted. Temporal information has many uses, including systems debugging.

– Dave Jarvis
Mar 13 at 4:04














23 Answers
23






active

oldest

votes


















58














Advantages are that you keep the history (good for auditing) and you don't have to worry about cascading a delete through various other tables in the database that reference the row you are deleting. Disadvantage is that you have to code any reporting/display methods to take the flag into account.



As far as if it is a common practice - I would say yes, but as with anything whether you use it depends on your business needs.



EDIT: Thought of another disadvantange - If you have unique indexes on the table, deleted records will still take up the "one" record, so you have to code around that possibility too (for example, a User table that has a unique index on username; A deleted record would still block the deleted users username for new records. Working around this you could tack on a GUID to the deleted username column, but it's a very hacky workaround that I wouldn't recommend. Probably in that circumstance it would be better to just have a rule that once a username is used, it can never be replaced.)






share|improve this answer


























  • Display as Active/Deactivated users =) On another note if it is a unique index (assuming here you mean the database is controlling the unique index) what do you mean by - it would still block the deleted users username for new records??

    – Coops
    Jan 22 '13 at 13:48











  • @CodeBlend - As I described above, if you had a User table with a unique index on the Username column, then if you do a soft/logical delete on a user named "Chris Shaffer" then that username would not become available for a new user to create a new account with, whereas if you did a hard/physical delete then the username would be available again.

    – Chris Shaffer
    Jan 22 '13 at 14:36











  • Ah, I was thinking in terms of the row, not the name of the user (username). If you want to maintain full history, so if there was an 'order' or something linked to that user, then you have to go for soft/logical delete.

    – Coops
    Jan 22 '13 at 15:28






  • 9





    @ChrisShaffer Alternatively, instead of a GUID, one can choose to index only non-deleted rows. E.g.: CREATE UNIQUE INDEX ... WHERE DELETED_AT is null (in PostgreSQL) and then all rows with any deletion date are not indexed. (They can be included in a non-unique index instead.)

    – KajMagnus
    Jun 19 '13 at 20:52








  • 4





    @Chris Shaffer: Quote "u don't have to worry about cascading a delete through various other tables". Not true, you'll have to forward the soft delete manually, which is a great pain in the ass and causes inconsistencies. This is actually a disadvantage, because there is no more foreign-key relationship enforcement. You will end up with data-garbage very soon.

    – Stefan Steiger
    Apr 26 '14 at 7:57



















24














Are logical deletes common practice? Yes I have seen this in many places. Are they secure? That really depends are they any less secure then the data was before you deleted it?



When I was a Tech Lead, I demanded that our team keep every piece of data, I knew at the time that we would be using all that data to build various BI applications, although at the time we didn't know what the requirements would be. While this was good from the standpoint of auditing, troubleshooting, and reporting (This was an e-commerce / tools site for B2B transactions, and if someone used a tool, we wanted to record it even if their account was later turned off), it did have several downsides.



The downsides include (not including others already mentioned):




  1. Performance Implications of keeping all that data, We to develop various archiving strategies. For example one area of the application was getting close to generating around 1Gb of data a week.

  2. Cost of keeping the data does grow over time, while disk space is cheap, the ammount of infrastructure to keep and manage terrabytes of data both online and off line is a lot. It takes a lot of disk for redundancy, and people's time to ensure backups are moving swiftly etc.


When deciding to use logical, physical deletes, or archiving I would ask myself these questions:




  1. Is this data that might need to be re-inserted into the table. For example User Accounts fit this category as you might activate or deactivate a user account. If this is the case a logical delete makes the most sense.

  2. Is there any intrinsic value in storing the data? If so how much data will be generated. Depending on this I would either go with a logical delete, or implement an archiving strategy. Keep in mind you can always archive logically deleted records.






share|improve this answer


























  • In your user accounts example, would it be good to keep actived and deactived users in separate tables ? Eg. Activated table and Deactivated table schema - Id,Name,etc.. Row in Activated - 1001,Smith007,etc... When he is deactivated, then we can clear all but ID column for smith in Activated and add him to Deactivated.

    – Borat Sagdiyev
    Apr 13 '14 at 2:00













  • What benefit is there in moving all the data if your going to leave the Id and the row? Maybe if your record is huge but I'd look at that as a micro-optimization.

    – JoshBerke
    May 13 '14 at 13:45











  • Good luck with cascading foreign key constraints if you are moving data around tables.

    – CAD bloke
    Jul 9 '17 at 13:57



















14














It might be a little late but I suggest everyone to check Pinal Dave's blog post about logical/soft delete:




I just do not like this kind of design [soft delete] at all. I am firm believer of the architecture where only necessary data should be in single table and the useless data should be moved to an archived table. Instead of following the isDeleted column, I suggest the usage of two different tables: one with orders and another with deleted orders. In that case, you will have to maintain both the table, but in reality, it is very easy to maintain. When you write UPDATE statement to the isDeleted column, write INSERT INTO another table and DELETE it from original table. If the situation is of rollback, write another INSERT INTO and DELETE in reverse order. If you are worried about a failed transaction, wrap this code in TRANSACTION.



What are the advantages of the smaller table verses larger table in above described situations?




  • A smaller table is easy to maintain

  • Index Rebuild operations are much faster

  • Moving the archive data to another filegroup will reduce the load of primary filegroup (considering that all filegroups are on different system) – this will also speed up the backup as well.

  • Statistics will be frequently updated due to smaller size and this will be less resource intensive.

  • Size of the index will be smaller

  • Performance of the table will improve with a smaller table size.







share|improve this answer



















  • 12





    how would you take care of foreign keys using such method? There may be 1, 10 or more other tables that reference the record being deleted and move to another table!

    – sam360
    Jun 7 '15 at 20:21











  • @sam360 - that's a big challenge. To be honest, I personally failed to implement the above recommendation in my projects, because of handling the PK and relationship between tables. Unfortunately there wasn't a real world example in that article. I'm working on a solution in one of my project, if it turned out to be a good implementation, I'll share the code with you...

    – Tohid
    Jun 8 '15 at 14:09











  • what is it called ? instead of soft-delete?

    – eugene
    Dec 20 '15 at 10:22






  • 1





    @eugene - I don't know any specific term for this solution. It's a really "delete" rows and keep deleted records in an "archive" table approach, if it makes sense to ya.

    – Tohid
    Dec 20 '15 at 20:37








  • 1





    I believe, "Moving the archive data to another filegroup" can be implemented as partitions in Oracle, so one gets the benefits listed above...

    – Betlista
    Oct 28 '18 at 16:13





















12














I'm a NoSQL developer, and on my last job, I worked with data that was always critical for someone, and if it was deleted by accident in the same day that was created, I were not able to find it in the last backup from yesterday! In that situation, soft deletion always saved the day.



I did soft-deletion using timestamps, registering the date the document was deleted:



IsDeleted = 20150310  //yyyyMMdd


Every Sunday, a process walked on the database and checked the IsDeleted field. If the difference between the current date and the timestamp was greater than N days, the document was hard deleted. Considering the document still be available on some backup, it was safe to do it.



EDIT: This NoSQL use case is about big documents created in the database, tens or hundreds of them every day, but not thousands or millions. By general, they were documents with the status, data and attachments of workflow processes. That was the reason why there was the possibility of a user deletes an important document. This user could be someone with Admin privileges, or maybe the document's owner, just to name a few.



TL;DR My use case was not Big Data. In that case, you will need a different approach.






share|improve this answer

































    8














    One pattern I have used is to create a mirror table and attach a trigger on the primary table, so all deletes (and updates if desired) are recorded in the mirror table.



    This allows you to "reconstruct" deleted/changed records, and you can still hard delete in the primary table and keep it "clean" - it also allows the creation of an "undo" function, and you can also record the date, time, and user who did the action in the mirror table (invaluable in witch hunt situations).



    The other advantage is there is no chance of accidently including deleted records when querying off the primary, unless you deliberately go to the trouble of including records from the mirror table (you may want to show live and deleted records).



    Another advantage is that the mirror table can be independently purged, as it should not have any actual foreign key references, making this a relatively simple operation in comparison to purging from a primary table that uses soft deletes, but still has referential connections to other tables.



    What other advantages ? - great if you have a bunch of coders working on the project, doing reads on the database with mixed skill and attention to detail levels, you don't have to stay up nights hoping that one of them didn’t forget to not include deleted records (lol, Not Include Deleted Records = True), which results in things like overstating say the clients available cash position which they then go buy some shares with (i.e., as in a trading system), when you work with trading systems, you will find out very quickly the value of robust solutions, even though they may have a little bit more initial "overhead".



    Exceptions:
    - as a guide, use soft deletes for "reference" data such as user, category, etc, and hard deletes to a mirror table for "fact" type data, i.e., transaction history.






    share|improve this answer

































      3














      I commonly use logical deletions - I find they work well when you also intermittently archive off the 'deleted' data to an archived table (which can be searched if needed) thus having no chance of affecting the performance of the application.



      It works well because you still have the data if you're ever audited. If you delete it physically, it's gone!






      share|improve this answer































        3














        I'm a big fan of the logical delete, especially for a Line of Business application, or in the context of user accounts. My reasons are simple: often times I don't want a user to be able to use the system anymore (so the account get's marked as deleted), but if we deleted the user, we'd lose all their work and such.



        Another common scenario is that the users might get re-created a while after having been delete. It's a much nicer experience for the user to have all their data present as it was before they were deleted, rather than have to re-create it.



        I usually think of deleting users more as "suspending" them indefinitely. You never know when they'll legitimately need to be back.






        share|improve this answer































          3














          Re: "Is this secure?" - that depends on what you mean.



          If you mean that by doing physical delete, you'll prevent anyone from ever finding the deleted data, then yes, that's more or less true; you're safer in physically deleting the sensitive data that needs to be erased, because that means it's permanently gone from the database. (However, realize that there may be other copies of the data in question, such as in a backup, or the transaction log, or a recorded version from in transit, e.g. a packet sniffer - just because you delete from your database doesn't guarantee it wasn't saved somewhere else.)



          If you mean that by doing logical delete, your data is more secure because you'll never lose any data, that's also true. This is good for audit scenarios; I tend to design this way because it admits the basic fact that once data is generated, it'll never really go away (especially if it ever had the capability of being, say, cached by an internet search engine). Of course, a real audit scenario requires that not only are deletes logical, but that updates are also logged, along with the time of the change and the actor who made the change.



          If you mean that the data won't fall into the hands of anyone who isn't supposed to see it, then that's totally up to your application and its security structure. In that respect, logical delete is no more or less secure than anything else in your database.






          share|improve this answer































            3














            I strongly disagree with logical delete because you are exposed to many errors.



            First of all queries, each query must take care the IsDeleted field and the possibility of error becomes higher with complex queries.



            Second the performance: imagine a table with 100000 recs with only 3 active, now multiply this number for the tables of your database; another performance problem is a possible conflict with new records with old (deleted records).



            The only advantage I see is the history of records, but there are other methods to achieve this result, for example you can create a logging table where you can save info: TableName,OldValues,NewValues,Date,User,[..] where *Values ​​can be varchar and write the details in this form fieldname : value; [..] or store the info as xml.



            All this can be achieved via code or Triggers but you are only ONE table with all your history.
            Another options is to see if the specified database engine are native support for tracking change, for example on SQL Server database there are SQL Track Data Change.






            share|improve this answer































              3














              I almost always soft delete and here's my 2 cents:




              • you can restore deleted data if a customer asks you to do so. More happy customers with soft deletes. Restoring specific data from backups is complex

              • checking for isdeleted everywhere is not an issue, you have to check for userid anyway (if the database contains data from multiple users). You can enforce the check by code, by placing those two checks on a separate function (or use views)

              • graceful delete. Users or processes dealing with deleted content will continue to "see" it until they hit the next refresh. This is a very desirable feature when a process is processing some data which is suddenly deleted

              • synchronization: if you need to design a synchronization mechanism between a database and mobile apps, you'll find soft deletes so less painful. Basically, you avoid sync paradoxes by moving the problem from a crazy ADD/UPDATE/DELETE to a simpler ADD/UPDATE






              share|improve this answer

































                2














                Logical deletions if are hard on referential integrity.



                It is the right think to do when there is a temporal aspect of the table data (are valid FROM_DATE - TO_DATE).



                Otherwise move the data to an Auditing Table and delete the record.



                On the plus side:



                It is the easier way to rollback (if at all possible).



                It is easy to see what was the state at a specific point in time.






                share|improve this answer































                  2














                  It's fairly standard in cases where you'd like to keep a history of something (e.g. user accounts as @Jon Dewees mentions). And it's certainly a great idea if there's a strong chance of users asking for un-deletions.



                  If you're concerned about the logic of filtering out the deleted records from your queries getting messy and just complicating your queries, you can just build views that do the filtering for you and use queries against that. It'll prevent leakage of these records in reporting solutions and such.






                  share|improve this answer































                    2














                    There are requirements beyond system design which need to be answered. What is the legal or statutory requirement in the record retention? Depending on what the rows are related to, there may be a legal requirement that the data be kept for a certain period of time after it is 'suspended'.



                    On the other hand, the requirement may be that once the record is 'deleted', it is truly and irrevocably deleted. Before you make a decision, talk to your stakeholders.






                    share|improve this answer































                      2














                      I used to do soft-delete, just to keep old records. I realized that users don't bother to view old records as often as I thought. If users want to view old records, they can just view from archive or audit table, right? So, what's the advantage of soft-delete? It only leads to more complex query statement, etc.



                      Following are the things i've implemented, before I decided to not-soft-delete anymore:




                      1. implement audit, to record all activities (add,edit,delete). Ensure that there's no foreign key linked to audit, and ensure this table is secured and nobody can delete except administrators.


                      2. identify which tables are considered "transactional table", which very likely that it will be kept for long time, and very likely user may want to view the past records or reports. For example; purchase transaction. This table should not just keep the id of master table (such as dept-id), but also keep the additional info such as the name as reference (such as dept-name), or any other necessary fields for reporting.


                      3. Implement "active/inactive" or "enable/disable" or "hide/show" record of master table. So, instead of deleting record, the user can disable/inactive the master record. It is much safer this way.



                      Just my two cents opinion.






                      share|improve this answer































                        1














                        They don't let the database perform as it should rendering such things as the cascade functionality useless.



                        For simple things such as inserts, in the case of re-inserting, then the code behind it doubles.



                        You can't just simply insert, instead you have to check for an existence and insert if it doesn't exist before or update the deletion flag if it does whilst also updating all other columns to the new values. This is seen as an update to the database transaction log and not a fresh insert causing inaccurate audit logs.



                        They cause performance issues because tables are getting glogged with redundant data. It plays havock with indexing especially with uniqueness.



                        I'm not a big fan of logical deletes.






                        share|improve this answer

































                          1














                          Mobile apps that depend on synchronisation might impose the use of logical rather than physical delete: a server must be able to indicate to the client that a record has been (marked as) deleted, and this might not be possible if records were physically deleted.






                          share|improve this answer































                            1














                            To reply to Tohid's comment, we faced same problem where we wanted to persist history of records and also we were not sure whether we wanted is_deleted column or not.



                            I am talking about our python implementation and a similar use-case we hit.



                            We encountered https://github.com/kvesteri/sqlalchemy-continuum which is an easy way to get versioning table for your corresponding table. Minimum lines of code and captures history for add, delete and update.



                            This serves more than just is_deleted column. You can always backref version table to check what happened with this entry. Whether entry got deleted, updated or added.



                            This way we didn't need to have is_deleted column at all and our delete function was pretty trivial. This way we also don't need to remember to mark is_deleted=False in any of our api's.






                            share|improve this answer

































                              1














                              It's 2018, and one big disadvantage of soft delete is:



                              GDPR compliance



                              Your application is probably not GDPR-compliant if you do soft deletes on anything that is considered personal data. [1][2]



                              Also keep in mind that, even if your company is not located within EU, as long as you're dealing with EU businesses’, residents’, or citizens’ data, you will have to comply with the GDPR. [3]






                              share|improve this answer































                                0














                                Soft Delete is a programming practice that being followed in most of the application when data is more relevant. Consider a case of financial application where a delete by the mistake of the end user can be fatal.
                                That is the case when soft delete becomes relevant. In soft delete the user is not actually deleting the data from the record instead its being flagged as IsDeleted to true (By normal convention).



                                In EF 6.x or EF 7 onward Softdelete is Added as an attribute but we have to create a custom attribute for the time being now.



                                I strongly recommend SoftDelete In a database design and its a good convention for the programming practice.






                                share|improve this answer































                                  0














                                  Well! As everyone said, it depends on the situation.



                                  If you have an index on a column like UserName or EmailID - and you never expect the same UserName or EmailID to be used again; you can go with a soft delete.



                                  That said, always check if your SELECT operation uses the primary key. If your SELECT statement uses a primary key, adding a flag with the WHERE clause wouldn't make much difference. Let's take an example (Pseudo):



                                  Table Users (UserID [primary key], EmailID, IsDeleted)



                                  SELECT * FROM Users where UserID = 123456 and IsDeleted = 0



                                  This query won't make any difference in terms of performance since UserID column has a primary key. Initially it will scan the table based on PK and then execute the next condition.



                                  Cases where soft deletes cannot work at all:



                                  Sign-up in majorly all websites take EmailID as your unique identification. We know very well, once an EmailID is used on a website like facebook, G+, it cannot be used by anyone else.



                                  There comes a day, when the user wants to delete his/her profile from the website. Now, if you make a logical delete, that user won't be able to register ever again. Also, registering again using the same EmailID wouldn't mean to restore the entire history. Everyone knows, deletion means deletion. In such scenarios, we have to make a physical delete. But in order to maintain the entire history of the account, we should always archive such records in either archive tables or deleted tables.



                                  Yes, in situations where we have lots of foreign tables, handling is quite cumbersome.



                                  Also keep in mind that soft/logical deletes will increase your table size, so the index size.






                                  share|improve this answer































                                    0














                                    Most of time softdeleting is used because you don't want to expose some data but you have to keep it for historical reasons (A product could become discontinued, so you don't want any new transaction with it but you still need to work with the history of sale transaction). By the way, some are copying the product information value in the sale transaction data instead of making a reference to the product to handle this.



                                    In fact it looks more like a rewording for a visible/hidden or active/inactive feature. Because that's the meaning of "delete" in business world. I'd like to say that Terminators may delete people but boss just fire them.



                                    This practice is pretty common pattern and used by a lot of application for a lot of reasons. As It's not the only way to achieve this, so you will have thousand of people saying that's great or bullshit and both have pretty good arguments.



                                    From a point of view of security, SoftDelete won't replace the job of Audit and it won't replace the job of backup too. If you are afraid of "the insert/delete between two backup case", you should read about Full or Bulk recovery Models. I admit that SoftDelete could make the recovery process more trivial.



                                    Up to you to know your requirement.






                                    share|improve this answer































                                      0














                                      To give an alternative, we have users using remote devices updating via MobiLink. If we delete records in the server database, those records never get marked deleted in the client databases.



                                      So we do both. We work with our clients to determine how long they wish to be able to recover data. For example, generally customers and products are active until our client say they should be deleted, but history of sales is only retained for 13 months and then deletes automatically. The client may want to keep deleted customers and products for two months but retain history for six months.



                                      So we run a script overnight that marks things logically deleted according to these parameters and then two/six months later, anything marked logically deleted today will be hard deleted.



                                      We're less about data security than about having enormous databases on a client device with limited memory, such as a smartphone. A client who orders 200 products twice a week for four years will have over 81,000 lines of history, of which 75% the client doesn't care if he sees.






                                      share|improve this answer































                                        0














                                        It all depends on the use case of the system and its data.



                                        For example, if you are talking about a government regulated system (e.g. a system at a pharmaceutical company that is considered a part of the quality system and must follow FDA guidelines for electronic records), then you darned well better not do hard deletes! An auditor from the FDA can come in and ask for all records in the system relating to product number ABC-123, and all data better be available. If your business process owner says the system shouldn't allow anyone to use product number ABC-123 on new records going forward, use the soft-delete method instead to make it "inactive" within the system, while still preserving historical data.



                                        However, maybe your system and its data has a use case such as "tracking the weather at the North Pole". Maybe you take temperature readings once every hour, and at the end of the day aggregate a daily average. Maybe the hourly data will no longer ever be used after aggregation, and you'd hard-delete the hourly readings after creating the aggregate. (This is a made-up, trivial example.)



                                        The point is, it all depends on the use case of the system and its data, and not a decision to be made purely from a technological standpoint.






                                        share|improve this answer

























                                          Your Answer






                                          StackExchange.ifUsing("editor", function () {
                                          StackExchange.using("externalEditor", function () {
                                          StackExchange.using("snippets", function () {
                                          StackExchange.snippets.init();
                                          });
                                          });
                                          }, "code-snippets");

                                          StackExchange.ready(function() {
                                          var channelOptions = {
                                          tags: "".split(" "),
                                          id: "1"
                                          };
                                          initTagRenderer("".split(" "), "".split(" "), channelOptions);

                                          StackExchange.using("externalEditor", function() {
                                          // Have to fire editor after snippets, if snippets enabled
                                          if (StackExchange.settings.snippets.snippetsEnabled) {
                                          StackExchange.using("snippets", function() {
                                          createEditor();
                                          });
                                          }
                                          else {
                                          createEditor();
                                          }
                                          });

                                          function createEditor() {
                                          StackExchange.prepareEditor({
                                          heartbeatType: 'answer',
                                          autoActivateHeartbeat: false,
                                          convertImagesToLinks: true,
                                          noModals: true,
                                          showLowRepImageUploadWarning: true,
                                          reputationToPostImages: 10,
                                          bindNavPrevention: true,
                                          postfix: "",
                                          imageUploader: {
                                          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                                          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                                          allowUrls: true
                                          },
                                          onDemand: true,
                                          discardSelector: ".discard-answer"
                                          ,immediatelyShowMarkdownHelp:true
                                          });


                                          }
                                          });














                                          draft saved

                                          draft discarded


















                                          StackExchange.ready(
                                          function () {
                                          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f378331%2fphysical-vs-logical-soft-delete-of-database-record%23new-answer', 'question_page');
                                          }
                                          );

                                          Post as a guest















                                          Required, but never shown

























                                          23 Answers
                                          23






                                          active

                                          oldest

                                          votes








                                          23 Answers
                                          23






                                          active

                                          oldest

                                          votes









                                          active

                                          oldest

                                          votes






                                          active

                                          oldest

                                          votes









                                          58














                                          Advantages are that you keep the history (good for auditing) and you don't have to worry about cascading a delete through various other tables in the database that reference the row you are deleting. Disadvantage is that you have to code any reporting/display methods to take the flag into account.



                                          As far as if it is a common practice - I would say yes, but as with anything whether you use it depends on your business needs.



                                          EDIT: Thought of another disadvantange - If you have unique indexes on the table, deleted records will still take up the "one" record, so you have to code around that possibility too (for example, a User table that has a unique index on username; A deleted record would still block the deleted users username for new records. Working around this you could tack on a GUID to the deleted username column, but it's a very hacky workaround that I wouldn't recommend. Probably in that circumstance it would be better to just have a rule that once a username is used, it can never be replaced.)






                                          share|improve this answer


























                                          • Display as Active/Deactivated users =) On another note if it is a unique index (assuming here you mean the database is controlling the unique index) what do you mean by - it would still block the deleted users username for new records??

                                            – Coops
                                            Jan 22 '13 at 13:48











                                          • @CodeBlend - As I described above, if you had a User table with a unique index on the Username column, then if you do a soft/logical delete on a user named "Chris Shaffer" then that username would not become available for a new user to create a new account with, whereas if you did a hard/physical delete then the username would be available again.

                                            – Chris Shaffer
                                            Jan 22 '13 at 14:36











                                          • Ah, I was thinking in terms of the row, not the name of the user (username). If you want to maintain full history, so if there was an 'order' or something linked to that user, then you have to go for soft/logical delete.

                                            – Coops
                                            Jan 22 '13 at 15:28






                                          • 9





                                            @ChrisShaffer Alternatively, instead of a GUID, one can choose to index only non-deleted rows. E.g.: CREATE UNIQUE INDEX ... WHERE DELETED_AT is null (in PostgreSQL) and then all rows with any deletion date are not indexed. (They can be included in a non-unique index instead.)

                                            – KajMagnus
                                            Jun 19 '13 at 20:52








                                          • 4





                                            @Chris Shaffer: Quote "u don't have to worry about cascading a delete through various other tables". Not true, you'll have to forward the soft delete manually, which is a great pain in the ass and causes inconsistencies. This is actually a disadvantage, because there is no more foreign-key relationship enforcement. You will end up with data-garbage very soon.

                                            – Stefan Steiger
                                            Apr 26 '14 at 7:57
















                                          58














                                          Advantages are that you keep the history (good for auditing) and you don't have to worry about cascading a delete through various other tables in the database that reference the row you are deleting. Disadvantage is that you have to code any reporting/display methods to take the flag into account.



                                          As far as if it is a common practice - I would say yes, but as with anything whether you use it depends on your business needs.



                                          EDIT: Thought of another disadvantange - If you have unique indexes on the table, deleted records will still take up the "one" record, so you have to code around that possibility too (for example, a User table that has a unique index on username; A deleted record would still block the deleted users username for new records. Working around this you could tack on a GUID to the deleted username column, but it's a very hacky workaround that I wouldn't recommend. Probably in that circumstance it would be better to just have a rule that once a username is used, it can never be replaced.)






                                          share|improve this answer


























                                          • Display as Active/Deactivated users =) On another note if it is a unique index (assuming here you mean the database is controlling the unique index) what do you mean by - it would still block the deleted users username for new records??

                                            – Coops
                                            Jan 22 '13 at 13:48











                                          • @CodeBlend - As I described above, if you had a User table with a unique index on the Username column, then if you do a soft/logical delete on a user named "Chris Shaffer" then that username would not become available for a new user to create a new account with, whereas if you did a hard/physical delete then the username would be available again.

                                            – Chris Shaffer
                                            Jan 22 '13 at 14:36











                                          • Ah, I was thinking in terms of the row, not the name of the user (username). If you want to maintain full history, so if there was an 'order' or something linked to that user, then you have to go for soft/logical delete.

                                            – Coops
                                            Jan 22 '13 at 15:28






                                          • 9





                                            @ChrisShaffer Alternatively, instead of a GUID, one can choose to index only non-deleted rows. E.g.: CREATE UNIQUE INDEX ... WHERE DELETED_AT is null (in PostgreSQL) and then all rows with any deletion date are not indexed. (They can be included in a non-unique index instead.)

                                            – KajMagnus
                                            Jun 19 '13 at 20:52








                                          • 4





                                            @Chris Shaffer: Quote "u don't have to worry about cascading a delete through various other tables". Not true, you'll have to forward the soft delete manually, which is a great pain in the ass and causes inconsistencies. This is actually a disadvantage, because there is no more foreign-key relationship enforcement. You will end up with data-garbage very soon.

                                            – Stefan Steiger
                                            Apr 26 '14 at 7:57














                                          58












                                          58








                                          58







                                          Advantages are that you keep the history (good for auditing) and you don't have to worry about cascading a delete through various other tables in the database that reference the row you are deleting. Disadvantage is that you have to code any reporting/display methods to take the flag into account.



                                          As far as if it is a common practice - I would say yes, but as with anything whether you use it depends on your business needs.



                                          EDIT: Thought of another disadvantange - If you have unique indexes on the table, deleted records will still take up the "one" record, so you have to code around that possibility too (for example, a User table that has a unique index on username; A deleted record would still block the deleted users username for new records. Working around this you could tack on a GUID to the deleted username column, but it's a very hacky workaround that I wouldn't recommend. Probably in that circumstance it would be better to just have a rule that once a username is used, it can never be replaced.)






                                          share|improve this answer















                                          Advantages are that you keep the history (good for auditing) and you don't have to worry about cascading a delete through various other tables in the database that reference the row you are deleting. Disadvantage is that you have to code any reporting/display methods to take the flag into account.



                                          As far as if it is a common practice - I would say yes, but as with anything whether you use it depends on your business needs.



                                          EDIT: Thought of another disadvantange - If you have unique indexes on the table, deleted records will still take up the "one" record, so you have to code around that possibility too (for example, a User table that has a unique index on username; A deleted record would still block the deleted users username for new records. Working around this you could tack on a GUID to the deleted username column, but it's a very hacky workaround that I wouldn't recommend. Probably in that circumstance it would be better to just have a rule that once a username is used, it can never be replaced.)







                                          share|improve this answer














                                          share|improve this answer



                                          share|improve this answer








                                          edited Dec 18 '08 at 16:22

























                                          answered Dec 18 '08 at 16:13









                                          Chris ShafferChris Shaffer

                                          28.4k44160




                                          28.4k44160













                                          • Display as Active/Deactivated users =) On another note if it is a unique index (assuming here you mean the database is controlling the unique index) what do you mean by - it would still block the deleted users username for new records??

                                            – Coops
                                            Jan 22 '13 at 13:48











                                          • @CodeBlend - As I described above, if you had a User table with a unique index on the Username column, then if you do a soft/logical delete on a user named "Chris Shaffer" then that username would not become available for a new user to create a new account with, whereas if you did a hard/physical delete then the username would be available again.

                                            – Chris Shaffer
                                            Jan 22 '13 at 14:36











                                          • Ah, I was thinking in terms of the row, not the name of the user (username). If you want to maintain full history, so if there was an 'order' or something linked to that user, then you have to go for soft/logical delete.

                                            – Coops
                                            Jan 22 '13 at 15:28






                                          • 9





                                            @ChrisShaffer Alternatively, instead of a GUID, one can choose to index only non-deleted rows. E.g.: CREATE UNIQUE INDEX ... WHERE DELETED_AT is null (in PostgreSQL) and then all rows with any deletion date are not indexed. (They can be included in a non-unique index instead.)

                                            – KajMagnus
                                            Jun 19 '13 at 20:52








                                          • 4





                                            @Chris Shaffer: Quote "u don't have to worry about cascading a delete through various other tables". Not true, you'll have to forward the soft delete manually, which is a great pain in the ass and causes inconsistencies. This is actually a disadvantage, because there is no more foreign-key relationship enforcement. You will end up with data-garbage very soon.

                                            – Stefan Steiger
                                            Apr 26 '14 at 7:57



















                                          • Display as Active/Deactivated users =) On another note if it is a unique index (assuming here you mean the database is controlling the unique index) what do you mean by - it would still block the deleted users username for new records??

                                            – Coops
                                            Jan 22 '13 at 13:48











                                          • @CodeBlend - As I described above, if you had a User table with a unique index on the Username column, then if you do a soft/logical delete on a user named "Chris Shaffer" then that username would not become available for a new user to create a new account with, whereas if you did a hard/physical delete then the username would be available again.

                                            – Chris Shaffer
                                            Jan 22 '13 at 14:36











                                          • Ah, I was thinking in terms of the row, not the name of the user (username). If you want to maintain full history, so if there was an 'order' or something linked to that user, then you have to go for soft/logical delete.

                                            – Coops
                                            Jan 22 '13 at 15:28






                                          • 9





                                            @ChrisShaffer Alternatively, instead of a GUID, one can choose to index only non-deleted rows. E.g.: CREATE UNIQUE INDEX ... WHERE DELETED_AT is null (in PostgreSQL) and then all rows with any deletion date are not indexed. (They can be included in a non-unique index instead.)

                                            – KajMagnus
                                            Jun 19 '13 at 20:52








                                          • 4





                                            @Chris Shaffer: Quote "u don't have to worry about cascading a delete through various other tables". Not true, you'll have to forward the soft delete manually, which is a great pain in the ass and causes inconsistencies. This is actually a disadvantage, because there is no more foreign-key relationship enforcement. You will end up with data-garbage very soon.

                                            – Stefan Steiger
                                            Apr 26 '14 at 7:57

















                                          Display as Active/Deactivated users =) On another note if it is a unique index (assuming here you mean the database is controlling the unique index) what do you mean by - it would still block the deleted users username for new records??

                                          – Coops
                                          Jan 22 '13 at 13:48





                                          Display as Active/Deactivated users =) On another note if it is a unique index (assuming here you mean the database is controlling the unique index) what do you mean by - it would still block the deleted users username for new records??

                                          – Coops
                                          Jan 22 '13 at 13:48













                                          @CodeBlend - As I described above, if you had a User table with a unique index on the Username column, then if you do a soft/logical delete on a user named "Chris Shaffer" then that username would not become available for a new user to create a new account with, whereas if you did a hard/physical delete then the username would be available again.

                                          – Chris Shaffer
                                          Jan 22 '13 at 14:36





                                          @CodeBlend - As I described above, if you had a User table with a unique index on the Username column, then if you do a soft/logical delete on a user named "Chris Shaffer" then that username would not become available for a new user to create a new account with, whereas if you did a hard/physical delete then the username would be available again.

                                          – Chris Shaffer
                                          Jan 22 '13 at 14:36













                                          Ah, I was thinking in terms of the row, not the name of the user (username). If you want to maintain full history, so if there was an 'order' or something linked to that user, then you have to go for soft/logical delete.

                                          – Coops
                                          Jan 22 '13 at 15:28





                                          Ah, I was thinking in terms of the row, not the name of the user (username). If you want to maintain full history, so if there was an 'order' or something linked to that user, then you have to go for soft/logical delete.

                                          – Coops
                                          Jan 22 '13 at 15:28




                                          9




                                          9





                                          @ChrisShaffer Alternatively, instead of a GUID, one can choose to index only non-deleted rows. E.g.: CREATE UNIQUE INDEX ... WHERE DELETED_AT is null (in PostgreSQL) and then all rows with any deletion date are not indexed. (They can be included in a non-unique index instead.)

                                          – KajMagnus
                                          Jun 19 '13 at 20:52







                                          @ChrisShaffer Alternatively, instead of a GUID, one can choose to index only non-deleted rows. E.g.: CREATE UNIQUE INDEX ... WHERE DELETED_AT is null (in PostgreSQL) and then all rows with any deletion date are not indexed. (They can be included in a non-unique index instead.)

                                          – KajMagnus
                                          Jun 19 '13 at 20:52






                                          4




                                          4





                                          @Chris Shaffer: Quote "u don't have to worry about cascading a delete through various other tables". Not true, you'll have to forward the soft delete manually, which is a great pain in the ass and causes inconsistencies. This is actually a disadvantage, because there is no more foreign-key relationship enforcement. You will end up with data-garbage very soon.

                                          – Stefan Steiger
                                          Apr 26 '14 at 7:57





                                          @Chris Shaffer: Quote "u don't have to worry about cascading a delete through various other tables". Not true, you'll have to forward the soft delete manually, which is a great pain in the ass and causes inconsistencies. This is actually a disadvantage, because there is no more foreign-key relationship enforcement. You will end up with data-garbage very soon.

                                          – Stefan Steiger
                                          Apr 26 '14 at 7:57













                                          24














                                          Are logical deletes common practice? Yes I have seen this in many places. Are they secure? That really depends are they any less secure then the data was before you deleted it?



                                          When I was a Tech Lead, I demanded that our team keep every piece of data, I knew at the time that we would be using all that data to build various BI applications, although at the time we didn't know what the requirements would be. While this was good from the standpoint of auditing, troubleshooting, and reporting (This was an e-commerce / tools site for B2B transactions, and if someone used a tool, we wanted to record it even if their account was later turned off), it did have several downsides.



                                          The downsides include (not including others already mentioned):




                                          1. Performance Implications of keeping all that data, We to develop various archiving strategies. For example one area of the application was getting close to generating around 1Gb of data a week.

                                          2. Cost of keeping the data does grow over time, while disk space is cheap, the ammount of infrastructure to keep and manage terrabytes of data both online and off line is a lot. It takes a lot of disk for redundancy, and people's time to ensure backups are moving swiftly etc.


                                          When deciding to use logical, physical deletes, or archiving I would ask myself these questions:




                                          1. Is this data that might need to be re-inserted into the table. For example User Accounts fit this category as you might activate or deactivate a user account. If this is the case a logical delete makes the most sense.

                                          2. Is there any intrinsic value in storing the data? If so how much data will be generated. Depending on this I would either go with a logical delete, or implement an archiving strategy. Keep in mind you can always archive logically deleted records.






                                          share|improve this answer


























                                          • In your user accounts example, would it be good to keep actived and deactived users in separate tables ? Eg. Activated table and Deactivated table schema - Id,Name,etc.. Row in Activated - 1001,Smith007,etc... When he is deactivated, then we can clear all but ID column for smith in Activated and add him to Deactivated.

                                            – Borat Sagdiyev
                                            Apr 13 '14 at 2:00













                                          • What benefit is there in moving all the data if your going to leave the Id and the row? Maybe if your record is huge but I'd look at that as a micro-optimization.

                                            – JoshBerke
                                            May 13 '14 at 13:45











                                          • Good luck with cascading foreign key constraints if you are moving data around tables.

                                            – CAD bloke
                                            Jul 9 '17 at 13:57
















                                          24














                                          Are logical deletes common practice? Yes I have seen this in many places. Are they secure? That really depends are they any less secure then the data was before you deleted it?



                                          When I was a Tech Lead, I demanded that our team keep every piece of data, I knew at the time that we would be using all that data to build various BI applications, although at the time we didn't know what the requirements would be. While this was good from the standpoint of auditing, troubleshooting, and reporting (This was an e-commerce / tools site for B2B transactions, and if someone used a tool, we wanted to record it even if their account was later turned off), it did have several downsides.



                                          The downsides include (not including others already mentioned):




                                          1. Performance Implications of keeping all that data, We to develop various archiving strategies. For example one area of the application was getting close to generating around 1Gb of data a week.

                                          2. Cost of keeping the data does grow over time, while disk space is cheap, the ammount of infrastructure to keep and manage terrabytes of data both online and off line is a lot. It takes a lot of disk for redundancy, and people's time to ensure backups are moving swiftly etc.


                                          When deciding to use logical, physical deletes, or archiving I would ask myself these questions:




                                          1. Is this data that might need to be re-inserted into the table. For example User Accounts fit this category as you might activate or deactivate a user account. If this is the case a logical delete makes the most sense.

                                          2. Is there any intrinsic value in storing the data? If so how much data will be generated. Depending on this I would either go with a logical delete, or implement an archiving strategy. Keep in mind you can always archive logically deleted records.






                                          share|improve this answer


























                                          • In your user accounts example, would it be good to keep actived and deactived users in separate tables ? Eg. Activated table and Deactivated table schema - Id,Name,etc.. Row in Activated - 1001,Smith007,etc... When he is deactivated, then we can clear all but ID column for smith in Activated and add him to Deactivated.

                                            – Borat Sagdiyev
                                            Apr 13 '14 at 2:00













                                          • What benefit is there in moving all the data if your going to leave the Id and the row? Maybe if your record is huge but I'd look at that as a micro-optimization.

                                            – JoshBerke
                                            May 13 '14 at 13:45











                                          • Good luck with cascading foreign key constraints if you are moving data around tables.

                                            – CAD bloke
                                            Jul 9 '17 at 13:57














                                          24












                                          24








                                          24







                                          Are logical deletes common practice? Yes I have seen this in many places. Are they secure? That really depends are they any less secure then the data was before you deleted it?



                                          When I was a Tech Lead, I demanded that our team keep every piece of data, I knew at the time that we would be using all that data to build various BI applications, although at the time we didn't know what the requirements would be. While this was good from the standpoint of auditing, troubleshooting, and reporting (This was an e-commerce / tools site for B2B transactions, and if someone used a tool, we wanted to record it even if their account was later turned off), it did have several downsides.



                                          The downsides include (not including others already mentioned):




                                          1. Performance Implications of keeping all that data, We to develop various archiving strategies. For example one area of the application was getting close to generating around 1Gb of data a week.

                                          2. Cost of keeping the data does grow over time, while disk space is cheap, the ammount of infrastructure to keep and manage terrabytes of data both online and off line is a lot. It takes a lot of disk for redundancy, and people's time to ensure backups are moving swiftly etc.


                                          When deciding to use logical, physical deletes, or archiving I would ask myself these questions:




                                          1. Is this data that might need to be re-inserted into the table. For example User Accounts fit this category as you might activate or deactivate a user account. If this is the case a logical delete makes the most sense.

                                          2. Is there any intrinsic value in storing the data? If so how much data will be generated. Depending on this I would either go with a logical delete, or implement an archiving strategy. Keep in mind you can always archive logically deleted records.






                                          share|improve this answer















                                          Are logical deletes common practice? Yes I have seen this in many places. Are they secure? That really depends are they any less secure then the data was before you deleted it?



                                          When I was a Tech Lead, I demanded that our team keep every piece of data, I knew at the time that we would be using all that data to build various BI applications, although at the time we didn't know what the requirements would be. While this was good from the standpoint of auditing, troubleshooting, and reporting (This was an e-commerce / tools site for B2B transactions, and if someone used a tool, we wanted to record it even if their account was later turned off), it did have several downsides.



                                          The downsides include (not including others already mentioned):




                                          1. Performance Implications of keeping all that data, We to develop various archiving strategies. For example one area of the application was getting close to generating around 1Gb of data a week.

                                          2. Cost of keeping the data does grow over time, while disk space is cheap, the ammount of infrastructure to keep and manage terrabytes of data both online and off line is a lot. It takes a lot of disk for redundancy, and people's time to ensure backups are moving swiftly etc.


                                          When deciding to use logical, physical deletes, or archiving I would ask myself these questions:




                                          1. Is this data that might need to be re-inserted into the table. For example User Accounts fit this category as you might activate or deactivate a user account. If this is the case a logical delete makes the most sense.

                                          2. Is there any intrinsic value in storing the data? If so how much data will be generated. Depending on this I would either go with a logical delete, or implement an archiving strategy. Keep in mind you can always archive logically deleted records.







                                          share|improve this answer














                                          share|improve this answer



                                          share|improve this answer








                                          edited Dec 18 '08 at 17:44

























                                          answered Dec 18 '08 at 16:36









                                          JoshBerkeJoshBerke

                                          54.5k20109154




                                          54.5k20109154













                                          • In your user accounts example, would it be good to keep actived and deactived users in separate tables ? Eg. Activated table and Deactivated table schema - Id,Name,etc.. Row in Activated - 1001,Smith007,etc... When he is deactivated, then we can clear all but ID column for smith in Activated and add him to Deactivated.

                                            – Borat Sagdiyev
                                            Apr 13 '14 at 2:00













                                          • What benefit is there in moving all the data if your going to leave the Id and the row? Maybe if your record is huge but I'd look at that as a micro-optimization.

                                            – JoshBerke
                                            May 13 '14 at 13:45











                                          • Good luck with cascading foreign key constraints if you are moving data around tables.

                                            – CAD bloke
                                            Jul 9 '17 at 13:57



















                                          • In your user accounts example, would it be good to keep actived and deactived users in separate tables ? Eg. Activated table and Deactivated table schema - Id,Name,etc.. Row in Activated - 1001,Smith007,etc... When he is deactivated, then we can clear all but ID column for smith in Activated and add him to Deactivated.

                                            – Borat Sagdiyev
                                            Apr 13 '14 at 2:00













                                          • What benefit is there in moving all the data if your going to leave the Id and the row? Maybe if your record is huge but I'd look at that as a micro-optimization.

                                            – JoshBerke
                                            May 13 '14 at 13:45











                                          • Good luck with cascading foreign key constraints if you are moving data around tables.

                                            – CAD bloke
                                            Jul 9 '17 at 13:57

















                                          In your user accounts example, would it be good to keep actived and deactived users in separate tables ? Eg. Activated table and Deactivated table schema - Id,Name,etc.. Row in Activated - 1001,Smith007,etc... When he is deactivated, then we can clear all but ID column for smith in Activated and add him to Deactivated.

                                          – Borat Sagdiyev
                                          Apr 13 '14 at 2:00







                                          In your user accounts example, would it be good to keep actived and deactived users in separate tables ? Eg. Activated table and Deactivated table schema - Id,Name,etc.. Row in Activated - 1001,Smith007,etc... When he is deactivated, then we can clear all but ID column for smith in Activated and add him to Deactivated.

                                          – Borat Sagdiyev
                                          Apr 13 '14 at 2:00















                                          What benefit is there in moving all the data if your going to leave the Id and the row? Maybe if your record is huge but I'd look at that as a micro-optimization.

                                          – JoshBerke
                                          May 13 '14 at 13:45





                                          What benefit is there in moving all the data if your going to leave the Id and the row? Maybe if your record is huge but I'd look at that as a micro-optimization.

                                          – JoshBerke
                                          May 13 '14 at 13:45













                                          Good luck with cascading foreign key constraints if you are moving data around tables.

                                          – CAD bloke
                                          Jul 9 '17 at 13:57





                                          Good luck with cascading foreign key constraints if you are moving data around tables.

                                          – CAD bloke
                                          Jul 9 '17 at 13:57











                                          14














                                          It might be a little late but I suggest everyone to check Pinal Dave's blog post about logical/soft delete:




                                          I just do not like this kind of design [soft delete] at all. I am firm believer of the architecture where only necessary data should be in single table and the useless data should be moved to an archived table. Instead of following the isDeleted column, I suggest the usage of two different tables: one with orders and another with deleted orders. In that case, you will have to maintain both the table, but in reality, it is very easy to maintain. When you write UPDATE statement to the isDeleted column, write INSERT INTO another table and DELETE it from original table. If the situation is of rollback, write another INSERT INTO and DELETE in reverse order. If you are worried about a failed transaction, wrap this code in TRANSACTION.



                                          What are the advantages of the smaller table verses larger table in above described situations?




                                          • A smaller table is easy to maintain

                                          • Index Rebuild operations are much faster

                                          • Moving the archive data to another filegroup will reduce the load of primary filegroup (considering that all filegroups are on different system) – this will also speed up the backup as well.

                                          • Statistics will be frequently updated due to smaller size and this will be less resource intensive.

                                          • Size of the index will be smaller

                                          • Performance of the table will improve with a smaller table size.







                                          share|improve this answer



















                                          • 12





                                            how would you take care of foreign keys using such method? There may be 1, 10 or more other tables that reference the record being deleted and move to another table!

                                            – sam360
                                            Jun 7 '15 at 20:21











                                          • @sam360 - that's a big challenge. To be honest, I personally failed to implement the above recommendation in my projects, because of handling the PK and relationship between tables. Unfortunately there wasn't a real world example in that article. I'm working on a solution in one of my project, if it turned out to be a good implementation, I'll share the code with you...

                                            – Tohid
                                            Jun 8 '15 at 14:09











                                          • what is it called ? instead of soft-delete?

                                            – eugene
                                            Dec 20 '15 at 10:22






                                          • 1





                                            @eugene - I don't know any specific term for this solution. It's a really "delete" rows and keep deleted records in an "archive" table approach, if it makes sense to ya.

                                            – Tohid
                                            Dec 20 '15 at 20:37








                                          • 1





                                            I believe, "Moving the archive data to another filegroup" can be implemented as partitions in Oracle, so one gets the benefits listed above...

                                            – Betlista
                                            Oct 28 '18 at 16:13


















                                          14














                                          It might be a little late but I suggest everyone to check Pinal Dave's blog post about logical/soft delete:




                                          I just do not like this kind of design [soft delete] at all. I am firm believer of the architecture where only necessary data should be in single table and the useless data should be moved to an archived table. Instead of following the isDeleted column, I suggest the usage of two different tables: one with orders and another with deleted orders. In that case, you will have to maintain both the table, but in reality, it is very easy to maintain. When you write UPDATE statement to the isDeleted column, write INSERT INTO another table and DELETE it from original table. If the situation is of rollback, write another INSERT INTO and DELETE in reverse order. If you are worried about a failed transaction, wrap this code in TRANSACTION.



                                          What are the advantages of the smaller table verses larger table in above described situations?




                                          • A smaller table is easy to maintain

                                          • Index Rebuild operations are much faster

                                          • Moving the archive data to another filegroup will reduce the load of primary filegroup (considering that all filegroups are on different system) – this will also speed up the backup as well.

                                          • Statistics will be frequently updated due to smaller size and this will be less resource intensive.

                                          • Size of the index will be smaller

                                          • Performance of the table will improve with a smaller table size.







                                          share|improve this answer



















                                          • 12





                                            how would you take care of foreign keys using such method? There may be 1, 10 or more other tables that reference the record being deleted and move to another table!

                                            – sam360
                                            Jun 7 '15 at 20:21











                                          • @sam360 - that's a big challenge. To be honest, I personally failed to implement the above recommendation in my projects, because of handling the PK and relationship between tables. Unfortunately there wasn't a real world example in that article. I'm working on a solution in one of my project, if it turned out to be a good implementation, I'll share the code with you...

                                            – Tohid
                                            Jun 8 '15 at 14:09











                                          • what is it called ? instead of soft-delete?

                                            – eugene
                                            Dec 20 '15 at 10:22






                                          • 1





                                            @eugene - I don't know any specific term for this solution. It's a really "delete" rows and keep deleted records in an "archive" table approach, if it makes sense to ya.

                                            – Tohid
                                            Dec 20 '15 at 20:37








                                          • 1





                                            I believe, "Moving the archive data to another filegroup" can be implemented as partitions in Oracle, so one gets the benefits listed above...

                                            – Betlista
                                            Oct 28 '18 at 16:13
















                                          14












                                          14








                                          14







                                          It might be a little late but I suggest everyone to check Pinal Dave's blog post about logical/soft delete:




                                          I just do not like this kind of design [soft delete] at all. I am firm believer of the architecture where only necessary data should be in single table and the useless data should be moved to an archived table. Instead of following the isDeleted column, I suggest the usage of two different tables: one with orders and another with deleted orders. In that case, you will have to maintain both the table, but in reality, it is very easy to maintain. When you write UPDATE statement to the isDeleted column, write INSERT INTO another table and DELETE it from original table. If the situation is of rollback, write another INSERT INTO and DELETE in reverse order. If you are worried about a failed transaction, wrap this code in TRANSACTION.



                                          What are the advantages of the smaller table verses larger table in above described situations?




                                          • A smaller table is easy to maintain

                                          • Index Rebuild operations are much faster

                                          • Moving the archive data to another filegroup will reduce the load of primary filegroup (considering that all filegroups are on different system) – this will also speed up the backup as well.

                                          • Statistics will be frequently updated due to smaller size and this will be less resource intensive.

                                          • Size of the index will be smaller

                                          • Performance of the table will improve with a smaller table size.







                                          share|improve this answer













                                          It might be a little late but I suggest everyone to check Pinal Dave's blog post about logical/soft delete:




                                          I just do not like this kind of design [soft delete] at all. I am firm believer of the architecture where only necessary data should be in single table and the useless data should be moved to an archived table. Instead of following the isDeleted column, I suggest the usage of two different tables: one with orders and another with deleted orders. In that case, you will have to maintain both the table, but in reality, it is very easy to maintain. When you write UPDATE statement to the isDeleted column, write INSERT INTO another table and DELETE it from original table. If the situation is of rollback, write another INSERT INTO and DELETE in reverse order. If you are worried about a failed transaction, wrap this code in TRANSACTION.



                                          What are the advantages of the smaller table verses larger table in above described situations?




                                          • A smaller table is easy to maintain

                                          • Index Rebuild operations are much faster

                                          • Moving the archive data to another filegroup will reduce the load of primary filegroup (considering that all filegroups are on different system) – this will also speed up the backup as well.

                                          • Statistics will be frequently updated due to smaller size and this will be less resource intensive.

                                          • Size of the index will be smaller

                                          • Performance of the table will improve with a smaller table size.








                                          share|improve this answer












                                          share|improve this answer



                                          share|improve this answer










                                          answered Sep 30 '14 at 16:42









                                          TohidTohid

                                          3,21042763




                                          3,21042763








                                          • 12





                                            how would you take care of foreign keys using such method? There may be 1, 10 or more other tables that reference the record being deleted and move to another table!

                                            – sam360
                                            Jun 7 '15 at 20:21











                                          • @sam360 - that's a big challenge. To be honest, I personally failed to implement the above recommendation in my projects, because of handling the PK and relationship between tables. Unfortunately there wasn't a real world example in that article. I'm working on a solution in one of my project, if it turned out to be a good implementation, I'll share the code with you...

                                            – Tohid
                                            Jun 8 '15 at 14:09











                                          • what is it called ? instead of soft-delete?

                                            – eugene
                                            Dec 20 '15 at 10:22






                                          • 1





                                            @eugene - I don't know any specific term for this solution. It's a really "delete" rows and keep deleted records in an "archive" table approach, if it makes sense to ya.

                                            – Tohid
                                            Dec 20 '15 at 20:37








                                          • 1





                                            I believe, "Moving the archive data to another filegroup" can be implemented as partitions in Oracle, so one gets the benefits listed above...

                                            – Betlista
                                            Oct 28 '18 at 16:13
















                                          • 12





                                            how would you take care of foreign keys using such method? There may be 1, 10 or more other tables that reference the record being deleted and move to another table!

                                            – sam360
                                            Jun 7 '15 at 20:21











                                          • @sam360 - that's a big challenge. To be honest, I personally failed to implement the above recommendation in my projects, because of handling the PK and relationship between tables. Unfortunately there wasn't a real world example in that article. I'm working on a solution in one of my project, if it turned out to be a good implementation, I'll share the code with you...

                                            – Tohid
                                            Jun 8 '15 at 14:09











                                          • what is it called ? instead of soft-delete?

                                            – eugene
                                            Dec 20 '15 at 10:22






                                          • 1





                                            @eugene - I don't know any specific term for this solution. It's a really "delete" rows and keep deleted records in an "archive" table approach, if it makes sense to ya.

                                            – Tohid
                                            Dec 20 '15 at 20:37








                                          • 1





                                            I believe, "Moving the archive data to another filegroup" can be implemented as partitions in Oracle, so one gets the benefits listed above...

                                            – Betlista
                                            Oct 28 '18 at 16:13










                                          12




                                          12





                                          how would you take care of foreign keys using such method? There may be 1, 10 or more other tables that reference the record being deleted and move to another table!

                                          – sam360
                                          Jun 7 '15 at 20:21





                                          how would you take care of foreign keys using such method? There may be 1, 10 or more other tables that reference the record being deleted and move to another table!

                                          – sam360
                                          Jun 7 '15 at 20:21













                                          @sam360 - that's a big challenge. To be honest, I personally failed to implement the above recommendation in my projects, because of handling the PK and relationship between tables. Unfortunately there wasn't a real world example in that article. I'm working on a solution in one of my project, if it turned out to be a good implementation, I'll share the code with you...

                                          – Tohid
                                          Jun 8 '15 at 14:09





                                          @sam360 - that's a big challenge. To be honest, I personally failed to implement the above recommendation in my projects, because of handling the PK and relationship between tables. Unfortunately there wasn't a real world example in that article. I'm working on a solution in one of my project, if it turned out to be a good implementation, I'll share the code with you...

                                          – Tohid
                                          Jun 8 '15 at 14:09













                                          what is it called ? instead of soft-delete?

                                          – eugene
                                          Dec 20 '15 at 10:22





                                          what is it called ? instead of soft-delete?

                                          – eugene
                                          Dec 20 '15 at 10:22




                                          1




                                          1





                                          @eugene - I don't know any specific term for this solution. It's a really "delete" rows and keep deleted records in an "archive" table approach, if it makes sense to ya.

                                          – Tohid
                                          Dec 20 '15 at 20:37







                                          @eugene - I don't know any specific term for this solution. It's a really "delete" rows and keep deleted records in an "archive" table approach, if it makes sense to ya.

                                          – Tohid
                                          Dec 20 '15 at 20:37






                                          1




                                          1





                                          I believe, "Moving the archive data to another filegroup" can be implemented as partitions in Oracle, so one gets the benefits listed above...

                                          – Betlista
                                          Oct 28 '18 at 16:13







                                          I believe, "Moving the archive data to another filegroup" can be implemented as partitions in Oracle, so one gets the benefits listed above...

                                          – Betlista
                                          Oct 28 '18 at 16:13













                                          12














                                          I'm a NoSQL developer, and on my last job, I worked with data that was always critical for someone, and if it was deleted by accident in the same day that was created, I were not able to find it in the last backup from yesterday! In that situation, soft deletion always saved the day.



                                          I did soft-deletion using timestamps, registering the date the document was deleted:



                                          IsDeleted = 20150310  //yyyyMMdd


                                          Every Sunday, a process walked on the database and checked the IsDeleted field. If the difference between the current date and the timestamp was greater than N days, the document was hard deleted. Considering the document still be available on some backup, it was safe to do it.



                                          EDIT: This NoSQL use case is about big documents created in the database, tens or hundreds of them every day, but not thousands or millions. By general, they were documents with the status, data and attachments of workflow processes. That was the reason why there was the possibility of a user deletes an important document. This user could be someone with Admin privileges, or maybe the document's owner, just to name a few.



                                          TL;DR My use case was not Big Data. In that case, you will need a different approach.






                                          share|improve this answer






























                                            12














                                            I'm a NoSQL developer, and on my last job, I worked with data that was always critical for someone, and if it was deleted by accident in the same day that was created, I were not able to find it in the last backup from yesterday! In that situation, soft deletion always saved the day.



                                            I did soft-deletion using timestamps, registering the date the document was deleted:



                                            IsDeleted = 20150310  //yyyyMMdd


                                            Every Sunday, a process walked on the database and checked the IsDeleted field. If the difference between the current date and the timestamp was greater than N days, the document was hard deleted. Considering the document still be available on some backup, it was safe to do it.



                                            EDIT: This NoSQL use case is about big documents created in the database, tens or hundreds of them every day, but not thousands or millions. By general, they were documents with the status, data and attachments of workflow processes. That was the reason why there was the possibility of a user deletes an important document. This user could be someone with Admin privileges, or maybe the document's owner, just to name a few.



                                            TL;DR My use case was not Big Data. In that case, you will need a different approach.






                                            share|improve this answer




























                                              12












                                              12








                                              12







                                              I'm a NoSQL developer, and on my last job, I worked with data that was always critical for someone, and if it was deleted by accident in the same day that was created, I were not able to find it in the last backup from yesterday! In that situation, soft deletion always saved the day.



                                              I did soft-deletion using timestamps, registering the date the document was deleted:



                                              IsDeleted = 20150310  //yyyyMMdd


                                              Every Sunday, a process walked on the database and checked the IsDeleted field. If the difference between the current date and the timestamp was greater than N days, the document was hard deleted. Considering the document still be available on some backup, it was safe to do it.



                                              EDIT: This NoSQL use case is about big documents created in the database, tens or hundreds of them every day, but not thousands or millions. By general, they were documents with the status, data and attachments of workflow processes. That was the reason why there was the possibility of a user deletes an important document. This user could be someone with Admin privileges, or maybe the document's owner, just to name a few.



                                              TL;DR My use case was not Big Data. In that case, you will need a different approach.






                                              share|improve this answer















                                              I'm a NoSQL developer, and on my last job, I worked with data that was always critical for someone, and if it was deleted by accident in the same day that was created, I were not able to find it in the last backup from yesterday! In that situation, soft deletion always saved the day.



                                              I did soft-deletion using timestamps, registering the date the document was deleted:



                                              IsDeleted = 20150310  //yyyyMMdd


                                              Every Sunday, a process walked on the database and checked the IsDeleted field. If the difference between the current date and the timestamp was greater than N days, the document was hard deleted. Considering the document still be available on some backup, it was safe to do it.



                                              EDIT: This NoSQL use case is about big documents created in the database, tens or hundreds of them every day, but not thousands or millions. By general, they were documents with the status, data and attachments of workflow processes. That was the reason why there was the possibility of a user deletes an important document. This user could be someone with Admin privileges, or maybe the document's owner, just to name a few.



                                              TL;DR My use case was not Big Data. In that case, you will need a different approach.







                                              share|improve this answer














                                              share|improve this answer



                                              share|improve this answer








                                              edited Feb 15 '17 at 7:05

























                                              answered Mar 11 '15 at 3:35









                                              Mario SMario S

                                              1,1591424




                                              1,1591424























                                                  8














                                                  One pattern I have used is to create a mirror table and attach a trigger on the primary table, so all deletes (and updates if desired) are recorded in the mirror table.



                                                  This allows you to "reconstruct" deleted/changed records, and you can still hard delete in the primary table and keep it "clean" - it also allows the creation of an "undo" function, and you can also record the date, time, and user who did the action in the mirror table (invaluable in witch hunt situations).



                                                  The other advantage is there is no chance of accidently including deleted records when querying off the primary, unless you deliberately go to the trouble of including records from the mirror table (you may want to show live and deleted records).



                                                  Another advantage is that the mirror table can be independently purged, as it should not have any actual foreign key references, making this a relatively simple operation in comparison to purging from a primary table that uses soft deletes, but still has referential connections to other tables.



                                                  What other advantages ? - great if you have a bunch of coders working on the project, doing reads on the database with mixed skill and attention to detail levels, you don't have to stay up nights hoping that one of them didn’t forget to not include deleted records (lol, Not Include Deleted Records = True), which results in things like overstating say the clients available cash position which they then go buy some shares with (i.e., as in a trading system), when you work with trading systems, you will find out very quickly the value of robust solutions, even though they may have a little bit more initial "overhead".



                                                  Exceptions:
                                                  - as a guide, use soft deletes for "reference" data such as user, category, etc, and hard deletes to a mirror table for "fact" type data, i.e., transaction history.






                                                  share|improve this answer






























                                                    8














                                                    One pattern I have used is to create a mirror table and attach a trigger on the primary table, so all deletes (and updates if desired) are recorded in the mirror table.



                                                    This allows you to "reconstruct" deleted/changed records, and you can still hard delete in the primary table and keep it "clean" - it also allows the creation of an "undo" function, and you can also record the date, time, and user who did the action in the mirror table (invaluable in witch hunt situations).



                                                    The other advantage is there is no chance of accidently including deleted records when querying off the primary, unless you deliberately go to the trouble of including records from the mirror table (you may want to show live and deleted records).



                                                    Another advantage is that the mirror table can be independently purged, as it should not have any actual foreign key references, making this a relatively simple operation in comparison to purging from a primary table that uses soft deletes, but still has referential connections to other tables.



                                                    What other advantages ? - great if you have a bunch of coders working on the project, doing reads on the database with mixed skill and attention to detail levels, you don't have to stay up nights hoping that one of them didn’t forget to not include deleted records (lol, Not Include Deleted Records = True), which results in things like overstating say the clients available cash position which they then go buy some shares with (i.e., as in a trading system), when you work with trading systems, you will find out very quickly the value of robust solutions, even though they may have a little bit more initial "overhead".



                                                    Exceptions:
                                                    - as a guide, use soft deletes for "reference" data such as user, category, etc, and hard deletes to a mirror table for "fact" type data, i.e., transaction history.






                                                    share|improve this answer




























                                                      8












                                                      8








                                                      8







                                                      One pattern I have used is to create a mirror table and attach a trigger on the primary table, so all deletes (and updates if desired) are recorded in the mirror table.



                                                      This allows you to "reconstruct" deleted/changed records, and you can still hard delete in the primary table and keep it "clean" - it also allows the creation of an "undo" function, and you can also record the date, time, and user who did the action in the mirror table (invaluable in witch hunt situations).



                                                      The other advantage is there is no chance of accidently including deleted records when querying off the primary, unless you deliberately go to the trouble of including records from the mirror table (you may want to show live and deleted records).



                                                      Another advantage is that the mirror table can be independently purged, as it should not have any actual foreign key references, making this a relatively simple operation in comparison to purging from a primary table that uses soft deletes, but still has referential connections to other tables.



                                                      What other advantages ? - great if you have a bunch of coders working on the project, doing reads on the database with mixed skill and attention to detail levels, you don't have to stay up nights hoping that one of them didn’t forget to not include deleted records (lol, Not Include Deleted Records = True), which results in things like overstating say the clients available cash position which they then go buy some shares with (i.e., as in a trading system), when you work with trading systems, you will find out very quickly the value of robust solutions, even though they may have a little bit more initial "overhead".



                                                      Exceptions:
                                                      - as a guide, use soft deletes for "reference" data such as user, category, etc, and hard deletes to a mirror table for "fact" type data, i.e., transaction history.






                                                      share|improve this answer















                                                      One pattern I have used is to create a mirror table and attach a trigger on the primary table, so all deletes (and updates if desired) are recorded in the mirror table.



                                                      This allows you to "reconstruct" deleted/changed records, and you can still hard delete in the primary table and keep it "clean" - it also allows the creation of an "undo" function, and you can also record the date, time, and user who did the action in the mirror table (invaluable in witch hunt situations).



                                                      The other advantage is there is no chance of accidently including deleted records when querying off the primary, unless you deliberately go to the trouble of including records from the mirror table (you may want to show live and deleted records).



                                                      Another advantage is that the mirror table can be independently purged, as it should not have any actual foreign key references, making this a relatively simple operation in comparison to purging from a primary table that uses soft deletes, but still has referential connections to other tables.



                                                      What other advantages ? - great if you have a bunch of coders working on the project, doing reads on the database with mixed skill and attention to detail levels, you don't have to stay up nights hoping that one of them didn’t forget to not include deleted records (lol, Not Include Deleted Records = True), which results in things like overstating say the clients available cash position which they then go buy some shares with (i.e., as in a trading system), when you work with trading systems, you will find out very quickly the value of robust solutions, even though they may have a little bit more initial "overhead".



                                                      Exceptions:
                                                      - as a guide, use soft deletes for "reference" data such as user, category, etc, and hard deletes to a mirror table for "fact" type data, i.e., transaction history.







                                                      share|improve this answer














                                                      share|improve this answer



                                                      share|improve this answer








                                                      edited Sep 9 '16 at 0:23

























                                                      answered Sep 9 '16 at 0:18









                                                      Code WarriorCode Warrior

                                                      8114




                                                      8114























                                                          3














                                                          I commonly use logical deletions - I find they work well when you also intermittently archive off the 'deleted' data to an archived table (which can be searched if needed) thus having no chance of affecting the performance of the application.



                                                          It works well because you still have the data if you're ever audited. If you delete it physically, it's gone!






                                                          share|improve this answer




























                                                            3














                                                            I commonly use logical deletions - I find they work well when you also intermittently archive off the 'deleted' data to an archived table (which can be searched if needed) thus having no chance of affecting the performance of the application.



                                                            It works well because you still have the data if you're ever audited. If you delete it physically, it's gone!






                                                            share|improve this answer


























                                                              3












                                                              3








                                                              3







                                                              I commonly use logical deletions - I find they work well when you also intermittently archive off the 'deleted' data to an archived table (which can be searched if needed) thus having no chance of affecting the performance of the application.



                                                              It works well because you still have the data if you're ever audited. If you delete it physically, it's gone!






                                                              share|improve this answer













                                                              I commonly use logical deletions - I find they work well when you also intermittently archive off the 'deleted' data to an archived table (which can be searched if needed) thus having no chance of affecting the performance of the application.



                                                              It works well because you still have the data if you're ever audited. If you delete it physically, it's gone!







                                                              share|improve this answer












                                                              share|improve this answer



                                                              share|improve this answer










                                                              answered Dec 18 '08 at 16:17









                                                              GalwegianGalwegian

                                                              37.6k14100154




                                                              37.6k14100154























                                                                  3














                                                                  I'm a big fan of the logical delete, especially for a Line of Business application, or in the context of user accounts. My reasons are simple: often times I don't want a user to be able to use the system anymore (so the account get's marked as deleted), but if we deleted the user, we'd lose all their work and such.



                                                                  Another common scenario is that the users might get re-created a while after having been delete. It's a much nicer experience for the user to have all their data present as it was before they were deleted, rather than have to re-create it.



                                                                  I usually think of deleting users more as "suspending" them indefinitely. You never know when they'll legitimately need to be back.






                                                                  share|improve this answer




























                                                                    3














                                                                    I'm a big fan of the logical delete, especially for a Line of Business application, or in the context of user accounts. My reasons are simple: often times I don't want a user to be able to use the system anymore (so the account get's marked as deleted), but if we deleted the user, we'd lose all their work and such.



                                                                    Another common scenario is that the users might get re-created a while after having been delete. It's a much nicer experience for the user to have all their data present as it was before they were deleted, rather than have to re-create it.



                                                                    I usually think of deleting users more as "suspending" them indefinitely. You never know when they'll legitimately need to be back.






                                                                    share|improve this answer


























                                                                      3












                                                                      3








                                                                      3







                                                                      I'm a big fan of the logical delete, especially for a Line of Business application, or in the context of user accounts. My reasons are simple: often times I don't want a user to be able to use the system anymore (so the account get's marked as deleted), but if we deleted the user, we'd lose all their work and such.



                                                                      Another common scenario is that the users might get re-created a while after having been delete. It's a much nicer experience for the user to have all their data present as it was before they were deleted, rather than have to re-create it.



                                                                      I usually think of deleting users more as "suspending" them indefinitely. You never know when they'll legitimately need to be back.






                                                                      share|improve this answer













                                                                      I'm a big fan of the logical delete, especially for a Line of Business application, or in the context of user accounts. My reasons are simple: often times I don't want a user to be able to use the system anymore (so the account get's marked as deleted), but if we deleted the user, we'd lose all their work and such.



                                                                      Another common scenario is that the users might get re-created a while after having been delete. It's a much nicer experience for the user to have all their data present as it was before they were deleted, rather than have to re-create it.



                                                                      I usually think of deleting users more as "suspending" them indefinitely. You never know when they'll legitimately need to be back.







                                                                      share|improve this answer












                                                                      share|improve this answer



                                                                      share|improve this answer










                                                                      answered Dec 18 '08 at 16:24









                                                                      Jon DeweesJon Dewees

                                                                      2,18252635




                                                                      2,18252635























                                                                          3














                                                                          Re: "Is this secure?" - that depends on what you mean.



                                                                          If you mean that by doing physical delete, you'll prevent anyone from ever finding the deleted data, then yes, that's more or less true; you're safer in physically deleting the sensitive data that needs to be erased, because that means it's permanently gone from the database. (However, realize that there may be other copies of the data in question, such as in a backup, or the transaction log, or a recorded version from in transit, e.g. a packet sniffer - just because you delete from your database doesn't guarantee it wasn't saved somewhere else.)



                                                                          If you mean that by doing logical delete, your data is more secure because you'll never lose any data, that's also true. This is good for audit scenarios; I tend to design this way because it admits the basic fact that once data is generated, it'll never really go away (especially if it ever had the capability of being, say, cached by an internet search engine). Of course, a real audit scenario requires that not only are deletes logical, but that updates are also logged, along with the time of the change and the actor who made the change.



                                                                          If you mean that the data won't fall into the hands of anyone who isn't supposed to see it, then that's totally up to your application and its security structure. In that respect, logical delete is no more or less secure than anything else in your database.






                                                                          share|improve this answer




























                                                                            3














                                                                            Re: "Is this secure?" - that depends on what you mean.



                                                                            If you mean that by doing physical delete, you'll prevent anyone from ever finding the deleted data, then yes, that's more or less true; you're safer in physically deleting the sensitive data that needs to be erased, because that means it's permanently gone from the database. (However, realize that there may be other copies of the data in question, such as in a backup, or the transaction log, or a recorded version from in transit, e.g. a packet sniffer - just because you delete from your database doesn't guarantee it wasn't saved somewhere else.)



                                                                            If you mean that by doing logical delete, your data is more secure because you'll never lose any data, that's also true. This is good for audit scenarios; I tend to design this way because it admits the basic fact that once data is generated, it'll never really go away (especially if it ever had the capability of being, say, cached by an internet search engine). Of course, a real audit scenario requires that not only are deletes logical, but that updates are also logged, along with the time of the change and the actor who made the change.



                                                                            If you mean that the data won't fall into the hands of anyone who isn't supposed to see it, then that's totally up to your application and its security structure. In that respect, logical delete is no more or less secure than anything else in your database.






                                                                            share|improve this answer


























                                                                              3












                                                                              3








                                                                              3







                                                                              Re: "Is this secure?" - that depends on what you mean.



                                                                              If you mean that by doing physical delete, you'll prevent anyone from ever finding the deleted data, then yes, that's more or less true; you're safer in physically deleting the sensitive data that needs to be erased, because that means it's permanently gone from the database. (However, realize that there may be other copies of the data in question, such as in a backup, or the transaction log, or a recorded version from in transit, e.g. a packet sniffer - just because you delete from your database doesn't guarantee it wasn't saved somewhere else.)



                                                                              If you mean that by doing logical delete, your data is more secure because you'll never lose any data, that's also true. This is good for audit scenarios; I tend to design this way because it admits the basic fact that once data is generated, it'll never really go away (especially if it ever had the capability of being, say, cached by an internet search engine). Of course, a real audit scenario requires that not only are deletes logical, but that updates are also logged, along with the time of the change and the actor who made the change.



                                                                              If you mean that the data won't fall into the hands of anyone who isn't supposed to see it, then that's totally up to your application and its security structure. In that respect, logical delete is no more or less secure than anything else in your database.






                                                                              share|improve this answer













                                                                              Re: "Is this secure?" - that depends on what you mean.



                                                                              If you mean that by doing physical delete, you'll prevent anyone from ever finding the deleted data, then yes, that's more or less true; you're safer in physically deleting the sensitive data that needs to be erased, because that means it's permanently gone from the database. (However, realize that there may be other copies of the data in question, such as in a backup, or the transaction log, or a recorded version from in transit, e.g. a packet sniffer - just because you delete from your database doesn't guarantee it wasn't saved somewhere else.)



                                                                              If you mean that by doing logical delete, your data is more secure because you'll never lose any data, that's also true. This is good for audit scenarios; I tend to design this way because it admits the basic fact that once data is generated, it'll never really go away (especially if it ever had the capability of being, say, cached by an internet search engine). Of course, a real audit scenario requires that not only are deletes logical, but that updates are also logged, along with the time of the change and the actor who made the change.



                                                                              If you mean that the data won't fall into the hands of anyone who isn't supposed to see it, then that's totally up to your application and its security structure. In that respect, logical delete is no more or less secure than anything else in your database.







                                                                              share|improve this answer












                                                                              share|improve this answer



                                                                              share|improve this answer










                                                                              answered Dec 18 '08 at 16:32









                                                                              Ian VarleyIan Varley

                                                                              7,33652233




                                                                              7,33652233























                                                                                  3














                                                                                  I strongly disagree with logical delete because you are exposed to many errors.



                                                                                  First of all queries, each query must take care the IsDeleted field and the possibility of error becomes higher with complex queries.



                                                                                  Second the performance: imagine a table with 100000 recs with only 3 active, now multiply this number for the tables of your database; another performance problem is a possible conflict with new records with old (deleted records).



                                                                                  The only advantage I see is the history of records, but there are other methods to achieve this result, for example you can create a logging table where you can save info: TableName,OldValues,NewValues,Date,User,[..] where *Values ​​can be varchar and write the details in this form fieldname : value; [..] or store the info as xml.



                                                                                  All this can be achieved via code or Triggers but you are only ONE table with all your history.
                                                                                  Another options is to see if the specified database engine are native support for tracking change, for example on SQL Server database there are SQL Track Data Change.






                                                                                  share|improve this answer




























                                                                                    3














                                                                                    I strongly disagree with logical delete because you are exposed to many errors.



                                                                                    First of all queries, each query must take care the IsDeleted field and the possibility of error becomes higher with complex queries.



                                                                                    Second the performance: imagine a table with 100000 recs with only 3 active, now multiply this number for the tables of your database; another performance problem is a possible conflict with new records with old (deleted records).



                                                                                    The only advantage I see is the history of records, but there are other methods to achieve this result, for example you can create a logging table where you can save info: TableName,OldValues,NewValues,Date,User,[..] where *Values ​​can be varchar and write the details in this form fieldname : value; [..] or store the info as xml.



                                                                                    All this can be achieved via code or Triggers but you are only ONE table with all your history.
                                                                                    Another options is to see if the specified database engine are native support for tracking change, for example on SQL Server database there are SQL Track Data Change.






                                                                                    share|improve this answer


























                                                                                      3












                                                                                      3








                                                                                      3







                                                                                      I strongly disagree with logical delete because you are exposed to many errors.



                                                                                      First of all queries, each query must take care the IsDeleted field and the possibility of error becomes higher with complex queries.



                                                                                      Second the performance: imagine a table with 100000 recs with only 3 active, now multiply this number for the tables of your database; another performance problem is a possible conflict with new records with old (deleted records).



                                                                                      The only advantage I see is the history of records, but there are other methods to achieve this result, for example you can create a logging table where you can save info: TableName,OldValues,NewValues,Date,User,[..] where *Values ​​can be varchar and write the details in this form fieldname : value; [..] or store the info as xml.



                                                                                      All this can be achieved via code or Triggers but you are only ONE table with all your history.
                                                                                      Another options is to see if the specified database engine are native support for tracking change, for example on SQL Server database there are SQL Track Data Change.






                                                                                      share|improve this answer













                                                                                      I strongly disagree with logical delete because you are exposed to many errors.



                                                                                      First of all queries, each query must take care the IsDeleted field and the possibility of error becomes higher with complex queries.



                                                                                      Second the performance: imagine a table with 100000 recs with only 3 active, now multiply this number for the tables of your database; another performance problem is a possible conflict with new records with old (deleted records).



                                                                                      The only advantage I see is the history of records, but there are other methods to achieve this result, for example you can create a logging table where you can save info: TableName,OldValues,NewValues,Date,User,[..] where *Values ​​can be varchar and write the details in this form fieldname : value; [..] or store the info as xml.



                                                                                      All this can be achieved via code or Triggers but you are only ONE table with all your history.
                                                                                      Another options is to see if the specified database engine are native support for tracking change, for example on SQL Server database there are SQL Track Data Change.







                                                                                      share|improve this answer












                                                                                      share|improve this answer



                                                                                      share|improve this answer










                                                                                      answered Sep 30 '14 at 17:18









                                                                                      MaxMax

                                                                                      3,70512341




                                                                                      3,70512341























                                                                                          3














                                                                                          I almost always soft delete and here's my 2 cents:




                                                                                          • you can restore deleted data if a customer asks you to do so. More happy customers with soft deletes. Restoring specific data from backups is complex

                                                                                          • checking for isdeleted everywhere is not an issue, you have to check for userid anyway (if the database contains data from multiple users). You can enforce the check by code, by placing those two checks on a separate function (or use views)

                                                                                          • graceful delete. Users or processes dealing with deleted content will continue to "see" it until they hit the next refresh. This is a very desirable feature when a process is processing some data which is suddenly deleted

                                                                                          • synchronization: if you need to design a synchronization mechanism between a database and mobile apps, you'll find soft deletes so less painful. Basically, you avoid sync paradoxes by moving the problem from a crazy ADD/UPDATE/DELETE to a simpler ADD/UPDATE






                                                                                          share|improve this answer






























                                                                                            3














                                                                                            I almost always soft delete and here's my 2 cents:




                                                                                            • you can restore deleted data if a customer asks you to do so. More happy customers with soft deletes. Restoring specific data from backups is complex

                                                                                            • checking for isdeleted everywhere is not an issue, you have to check for userid anyway (if the database contains data from multiple users). You can enforce the check by code, by placing those two checks on a separate function (or use views)

                                                                                            • graceful delete. Users or processes dealing with deleted content will continue to "see" it until they hit the next refresh. This is a very desirable feature when a process is processing some data which is suddenly deleted

                                                                                            • synchronization: if you need to design a synchronization mechanism between a database and mobile apps, you'll find soft deletes so less painful. Basically, you avoid sync paradoxes by moving the problem from a crazy ADD/UPDATE/DELETE to a simpler ADD/UPDATE






                                                                                            share|improve this answer




























                                                                                              3












                                                                                              3








                                                                                              3







                                                                                              I almost always soft delete and here's my 2 cents:




                                                                                              • you can restore deleted data if a customer asks you to do so. More happy customers with soft deletes. Restoring specific data from backups is complex

                                                                                              • checking for isdeleted everywhere is not an issue, you have to check for userid anyway (if the database contains data from multiple users). You can enforce the check by code, by placing those two checks on a separate function (or use views)

                                                                                              • graceful delete. Users or processes dealing with deleted content will continue to "see" it until they hit the next refresh. This is a very desirable feature when a process is processing some data which is suddenly deleted

                                                                                              • synchronization: if you need to design a synchronization mechanism between a database and mobile apps, you'll find soft deletes so less painful. Basically, you avoid sync paradoxes by moving the problem from a crazy ADD/UPDATE/DELETE to a simpler ADD/UPDATE






                                                                                              share|improve this answer















                                                                                              I almost always soft delete and here's my 2 cents:




                                                                                              • you can restore deleted data if a customer asks you to do so. More happy customers with soft deletes. Restoring specific data from backups is complex

                                                                                              • checking for isdeleted everywhere is not an issue, you have to check for userid anyway (if the database contains data from multiple users). You can enforce the check by code, by placing those two checks on a separate function (or use views)

                                                                                              • graceful delete. Users or processes dealing with deleted content will continue to "see" it until they hit the next refresh. This is a very desirable feature when a process is processing some data which is suddenly deleted

                                                                                              • synchronization: if you need to design a synchronization mechanism between a database and mobile apps, you'll find soft deletes so less painful. Basically, you avoid sync paradoxes by moving the problem from a crazy ADD/UPDATE/DELETE to a simpler ADD/UPDATE







                                                                                              share|improve this answer














                                                                                              share|improve this answer



                                                                                              share|improve this answer








                                                                                              edited Nov 16 '18 at 1:55









                                                                                              Pang

                                                                                              6,9791666105




                                                                                              6,9791666105










                                                                                              answered Jun 9 '18 at 12:44









                                                                                              Gianluca GhettiniGianluca Ghettini

                                                                                              5,48864284




                                                                                              5,48864284























                                                                                                  2














                                                                                                  Logical deletions if are hard on referential integrity.



                                                                                                  It is the right think to do when there is a temporal aspect of the table data (are valid FROM_DATE - TO_DATE).



                                                                                                  Otherwise move the data to an Auditing Table and delete the record.



                                                                                                  On the plus side:



                                                                                                  It is the easier way to rollback (if at all possible).



                                                                                                  It is easy to see what was the state at a specific point in time.






                                                                                                  share|improve this answer




























                                                                                                    2














                                                                                                    Logical deletions if are hard on referential integrity.



                                                                                                    It is the right think to do when there is a temporal aspect of the table data (are valid FROM_DATE - TO_DATE).



                                                                                                    Otherwise move the data to an Auditing Table and delete the record.



                                                                                                    On the plus side:



                                                                                                    It is the easier way to rollback (if at all possible).



                                                                                                    It is easy to see what was the state at a specific point in time.






                                                                                                    share|improve this answer


























                                                                                                      2












                                                                                                      2








                                                                                                      2







                                                                                                      Logical deletions if are hard on referential integrity.



                                                                                                      It is the right think to do when there is a temporal aspect of the table data (are valid FROM_DATE - TO_DATE).



                                                                                                      Otherwise move the data to an Auditing Table and delete the record.



                                                                                                      On the plus side:



                                                                                                      It is the easier way to rollback (if at all possible).



                                                                                                      It is easy to see what was the state at a specific point in time.






                                                                                                      share|improve this answer













                                                                                                      Logical deletions if are hard on referential integrity.



                                                                                                      It is the right think to do when there is a temporal aspect of the table data (are valid FROM_DATE - TO_DATE).



                                                                                                      Otherwise move the data to an Auditing Table and delete the record.



                                                                                                      On the plus side:



                                                                                                      It is the easier way to rollback (if at all possible).



                                                                                                      It is easy to see what was the state at a specific point in time.







                                                                                                      share|improve this answer












                                                                                                      share|improve this answer



                                                                                                      share|improve this answer










                                                                                                      answered Dec 18 '08 at 16:31









                                                                                                      pkariopkario

                                                                                                      1,34931929




                                                                                                      1,34931929























                                                                                                          2














                                                                                                          It's fairly standard in cases where you'd like to keep a history of something (e.g. user accounts as @Jon Dewees mentions). And it's certainly a great idea if there's a strong chance of users asking for un-deletions.



                                                                                                          If you're concerned about the logic of filtering out the deleted records from your queries getting messy and just complicating your queries, you can just build views that do the filtering for you and use queries against that. It'll prevent leakage of these records in reporting solutions and such.






                                                                                                          share|improve this answer




























                                                                                                            2














                                                                                                            It's fairly standard in cases where you'd like to keep a history of something (e.g. user accounts as @Jon Dewees mentions). And it's certainly a great idea if there's a strong chance of users asking for un-deletions.



                                                                                                            If you're concerned about the logic of filtering out the deleted records from your queries getting messy and just complicating your queries, you can just build views that do the filtering for you and use queries against that. It'll prevent leakage of these records in reporting solutions and such.






                                                                                                            share|improve this answer


























                                                                                                              2












                                                                                                              2








                                                                                                              2







                                                                                                              It's fairly standard in cases where you'd like to keep a history of something (e.g. user accounts as @Jon Dewees mentions). And it's certainly a great idea if there's a strong chance of users asking for un-deletions.



                                                                                                              If you're concerned about the logic of filtering out the deleted records from your queries getting messy and just complicating your queries, you can just build views that do the filtering for you and use queries against that. It'll prevent leakage of these records in reporting solutions and such.






                                                                                                              share|improve this answer













                                                                                                              It's fairly standard in cases where you'd like to keep a history of something (e.g. user accounts as @Jon Dewees mentions). And it's certainly a great idea if there's a strong chance of users asking for un-deletions.



                                                                                                              If you're concerned about the logic of filtering out the deleted records from your queries getting messy and just complicating your queries, you can just build views that do the filtering for you and use queries against that. It'll prevent leakage of these records in reporting solutions and such.







                                                                                                              share|improve this answer












                                                                                                              share|improve this answer



                                                                                                              share|improve this answer










                                                                                                              answered Dec 18 '08 at 16:34









                                                                                                              BQ.BQ.

                                                                                                              8,40832033




                                                                                                              8,40832033























                                                                                                                  2














                                                                                                                  There are requirements beyond system design which need to be answered. What is the legal or statutory requirement in the record retention? Depending on what the rows are related to, there may be a legal requirement that the data be kept for a certain period of time after it is 'suspended'.



                                                                                                                  On the other hand, the requirement may be that once the record is 'deleted', it is truly and irrevocably deleted. Before you make a decision, talk to your stakeholders.






                                                                                                                  share|improve this answer




























                                                                                                                    2














                                                                                                                    There are requirements beyond system design which need to be answered. What is the legal or statutory requirement in the record retention? Depending on what the rows are related to, there may be a legal requirement that the data be kept for a certain period of time after it is 'suspended'.



                                                                                                                    On the other hand, the requirement may be that once the record is 'deleted', it is truly and irrevocably deleted. Before you make a decision, talk to your stakeholders.






                                                                                                                    share|improve this answer


























                                                                                                                      2












                                                                                                                      2








                                                                                                                      2







                                                                                                                      There are requirements beyond system design which need to be answered. What is the legal or statutory requirement in the record retention? Depending on what the rows are related to, there may be a legal requirement that the data be kept for a certain period of time after it is 'suspended'.



                                                                                                                      On the other hand, the requirement may be that once the record is 'deleted', it is truly and irrevocably deleted. Before you make a decision, talk to your stakeholders.






                                                                                                                      share|improve this answer













                                                                                                                      There are requirements beyond system design which need to be answered. What is the legal or statutory requirement in the record retention? Depending on what the rows are related to, there may be a legal requirement that the data be kept for a certain period of time after it is 'suspended'.



                                                                                                                      On the other hand, the requirement may be that once the record is 'deleted', it is truly and irrevocably deleted. Before you make a decision, talk to your stakeholders.







                                                                                                                      share|improve this answer












                                                                                                                      share|improve this answer



                                                                                                                      share|improve this answer










                                                                                                                      answered Feb 20 '15 at 13:03









                                                                                                                      DaveDave

                                                                                                                      211




                                                                                                                      211























                                                                                                                          2














                                                                                                                          I used to do soft-delete, just to keep old records. I realized that users don't bother to view old records as often as I thought. If users want to view old records, they can just view from archive or audit table, right? So, what's the advantage of soft-delete? It only leads to more complex query statement, etc.



                                                                                                                          Following are the things i've implemented, before I decided to not-soft-delete anymore:




                                                                                                                          1. implement audit, to record all activities (add,edit,delete). Ensure that there's no foreign key linked to audit, and ensure this table is secured and nobody can delete except administrators.


                                                                                                                          2. identify which tables are considered "transactional table", which very likely that it will be kept for long time, and very likely user may want to view the past records or reports. For example; purchase transaction. This table should not just keep the id of master table (such as dept-id), but also keep the additional info such as the name as reference (such as dept-name), or any other necessary fields for reporting.


                                                                                                                          3. Implement "active/inactive" or "enable/disable" or "hide/show" record of master table. So, instead of deleting record, the user can disable/inactive the master record. It is much safer this way.



                                                                                                                          Just my two cents opinion.






                                                                                                                          share|improve this answer




























                                                                                                                            2














                                                                                                                            I used to do soft-delete, just to keep old records. I realized that users don't bother to view old records as often as I thought. If users want to view old records, they can just view from archive or audit table, right? So, what's the advantage of soft-delete? It only leads to more complex query statement, etc.



                                                                                                                            Following are the things i've implemented, before I decided to not-soft-delete anymore:




                                                                                                                            1. implement audit, to record all activities (add,edit,delete). Ensure that there's no foreign key linked to audit, and ensure this table is secured and nobody can delete except administrators.


                                                                                                                            2. identify which tables are considered "transactional table", which very likely that it will be kept for long time, and very likely user may want to view the past records or reports. For example; purchase transaction. This table should not just keep the id of master table (such as dept-id), but also keep the additional info such as the name as reference (such as dept-name), or any other necessary fields for reporting.


                                                                                                                            3. Implement "active/inactive" or "enable/disable" or "hide/show" record of master table. So, instead of deleting record, the user can disable/inactive the master record. It is much safer this way.



                                                                                                                            Just my two cents opinion.






                                                                                                                            share|improve this answer


























                                                                                                                              2












                                                                                                                              2








                                                                                                                              2







                                                                                                                              I used to do soft-delete, just to keep old records. I realized that users don't bother to view old records as often as I thought. If users want to view old records, they can just view from archive or audit table, right? So, what's the advantage of soft-delete? It only leads to more complex query statement, etc.



                                                                                                                              Following are the things i've implemented, before I decided to not-soft-delete anymore:




                                                                                                                              1. implement audit, to record all activities (add,edit,delete). Ensure that there's no foreign key linked to audit, and ensure this table is secured and nobody can delete except administrators.


                                                                                                                              2. identify which tables are considered "transactional table", which very likely that it will be kept for long time, and very likely user may want to view the past records or reports. For example; purchase transaction. This table should not just keep the id of master table (such as dept-id), but also keep the additional info such as the name as reference (such as dept-name), or any other necessary fields for reporting.


                                                                                                                              3. Implement "active/inactive" or "enable/disable" or "hide/show" record of master table. So, instead of deleting record, the user can disable/inactive the master record. It is much safer this way.



                                                                                                                              Just my two cents opinion.






                                                                                                                              share|improve this answer













                                                                                                                              I used to do soft-delete, just to keep old records. I realized that users don't bother to view old records as often as I thought. If users want to view old records, they can just view from archive or audit table, right? So, what's the advantage of soft-delete? It only leads to more complex query statement, etc.



                                                                                                                              Following are the things i've implemented, before I decided to not-soft-delete anymore:




                                                                                                                              1. implement audit, to record all activities (add,edit,delete). Ensure that there's no foreign key linked to audit, and ensure this table is secured and nobody can delete except administrators.


                                                                                                                              2. identify which tables are considered "transactional table", which very likely that it will be kept for long time, and very likely user may want to view the past records or reports. For example; purchase transaction. This table should not just keep the id of master table (such as dept-id), but also keep the additional info such as the name as reference (such as dept-name), or any other necessary fields for reporting.


                                                                                                                              3. Implement "active/inactive" or "enable/disable" or "hide/show" record of master table. So, instead of deleting record, the user can disable/inactive the master record. It is much safer this way.



                                                                                                                              Just my two cents opinion.







                                                                                                                              share|improve this answer












                                                                                                                              share|improve this answer



                                                                                                                              share|improve this answer










                                                                                                                              answered Jun 6 '16 at 3:06









                                                                                                                              DavidDavid

                                                                                                                              212




                                                                                                                              212























                                                                                                                                  1














                                                                                                                                  They don't let the database perform as it should rendering such things as the cascade functionality useless.



                                                                                                                                  For simple things such as inserts, in the case of re-inserting, then the code behind it doubles.



                                                                                                                                  You can't just simply insert, instead you have to check for an existence and insert if it doesn't exist before or update the deletion flag if it does whilst also updating all other columns to the new values. This is seen as an update to the database transaction log and not a fresh insert causing inaccurate audit logs.



                                                                                                                                  They cause performance issues because tables are getting glogged with redundant data. It plays havock with indexing especially with uniqueness.



                                                                                                                                  I'm not a big fan of logical deletes.






                                                                                                                                  share|improve this answer






























                                                                                                                                    1














                                                                                                                                    They don't let the database perform as it should rendering such things as the cascade functionality useless.



                                                                                                                                    For simple things such as inserts, in the case of re-inserting, then the code behind it doubles.



                                                                                                                                    You can't just simply insert, instead you have to check for an existence and insert if it doesn't exist before or update the deletion flag if it does whilst also updating all other columns to the new values. This is seen as an update to the database transaction log and not a fresh insert causing inaccurate audit logs.



                                                                                                                                    They cause performance issues because tables are getting glogged with redundant data. It plays havock with indexing especially with uniqueness.



                                                                                                                                    I'm not a big fan of logical deletes.






                                                                                                                                    share|improve this answer




























                                                                                                                                      1












                                                                                                                                      1








                                                                                                                                      1







                                                                                                                                      They don't let the database perform as it should rendering such things as the cascade functionality useless.



                                                                                                                                      For simple things such as inserts, in the case of re-inserting, then the code behind it doubles.



                                                                                                                                      You can't just simply insert, instead you have to check for an existence and insert if it doesn't exist before or update the deletion flag if it does whilst also updating all other columns to the new values. This is seen as an update to the database transaction log and not a fresh insert causing inaccurate audit logs.



                                                                                                                                      They cause performance issues because tables are getting glogged with redundant data. It plays havock with indexing especially with uniqueness.



                                                                                                                                      I'm not a big fan of logical deletes.






                                                                                                                                      share|improve this answer















                                                                                                                                      They don't let the database perform as it should rendering such things as the cascade functionality useless.



                                                                                                                                      For simple things such as inserts, in the case of re-inserting, then the code behind it doubles.



                                                                                                                                      You can't just simply insert, instead you have to check for an existence and insert if it doesn't exist before or update the deletion flag if it does whilst also updating all other columns to the new values. This is seen as an update to the database transaction log and not a fresh insert causing inaccurate audit logs.



                                                                                                                                      They cause performance issues because tables are getting glogged with redundant data. It plays havock with indexing especially with uniqueness.



                                                                                                                                      I'm not a big fan of logical deletes.







                                                                                                                                      share|improve this answer














                                                                                                                                      share|improve this answer



                                                                                                                                      share|improve this answer








                                                                                                                                      edited Oct 11 '12 at 19:13









                                                                                                                                      matthias krull

                                                                                                                                      3,21532650




                                                                                                                                      3,21532650










                                                                                                                                      answered Jul 4 '12 at 15:47









                                                                                                                                      TaqveemTaqveem

                                                                                                                                      111




                                                                                                                                      111























                                                                                                                                          1














                                                                                                                                          Mobile apps that depend on synchronisation might impose the use of logical rather than physical delete: a server must be able to indicate to the client that a record has been (marked as) deleted, and this might not be possible if records were physically deleted.






                                                                                                                                          share|improve this answer




























                                                                                                                                            1














                                                                                                                                            Mobile apps that depend on synchronisation might impose the use of logical rather than physical delete: a server must be able to indicate to the client that a record has been (marked as) deleted, and this might not be possible if records were physically deleted.






                                                                                                                                            share|improve this answer


























                                                                                                                                              1












                                                                                                                                              1








                                                                                                                                              1







                                                                                                                                              Mobile apps that depend on synchronisation might impose the use of logical rather than physical delete: a server must be able to indicate to the client that a record has been (marked as) deleted, and this might not be possible if records were physically deleted.






                                                                                                                                              share|improve this answer













                                                                                                                                              Mobile apps that depend on synchronisation might impose the use of logical rather than physical delete: a server must be able to indicate to the client that a record has been (marked as) deleted, and this might not be possible if records were physically deleted.







                                                                                                                                              share|improve this answer












                                                                                                                                              share|improve this answer



                                                                                                                                              share|improve this answer










                                                                                                                                              answered Jul 15 '15 at 9:10









                                                                                                                                              axdaxd

                                                                                                                                              523412




                                                                                                                                              523412























                                                                                                                                                  1














                                                                                                                                                  To reply to Tohid's comment, we faced same problem where we wanted to persist history of records and also we were not sure whether we wanted is_deleted column or not.



                                                                                                                                                  I am talking about our python implementation and a similar use-case we hit.



                                                                                                                                                  We encountered https://github.com/kvesteri/sqlalchemy-continuum which is an easy way to get versioning table for your corresponding table. Minimum lines of code and captures history for add, delete and update.



                                                                                                                                                  This serves more than just is_deleted column. You can always backref version table to check what happened with this entry. Whether entry got deleted, updated or added.



                                                                                                                                                  This way we didn't need to have is_deleted column at all and our delete function was pretty trivial. This way we also don't need to remember to mark is_deleted=False in any of our api's.






                                                                                                                                                  share|improve this answer






























                                                                                                                                                    1














                                                                                                                                                    To reply to Tohid's comment, we faced same problem where we wanted to persist history of records and also we were not sure whether we wanted is_deleted column or not.



                                                                                                                                                    I am talking about our python implementation and a similar use-case we hit.



                                                                                                                                                    We encountered https://github.com/kvesteri/sqlalchemy-continuum which is an easy way to get versioning table for your corresponding table. Minimum lines of code and captures history for add, delete and update.



                                                                                                                                                    This serves more than just is_deleted column. You can always backref version table to check what happened with this entry. Whether entry got deleted, updated or added.



                                                                                                                                                    This way we didn't need to have is_deleted column at all and our delete function was pretty trivial. This way we also don't need to remember to mark is_deleted=False in any of our api's.






                                                                                                                                                    share|improve this answer




























                                                                                                                                                      1












                                                                                                                                                      1








                                                                                                                                                      1







                                                                                                                                                      To reply to Tohid's comment, we faced same problem where we wanted to persist history of records and also we were not sure whether we wanted is_deleted column or not.



                                                                                                                                                      I am talking about our python implementation and a similar use-case we hit.



                                                                                                                                                      We encountered https://github.com/kvesteri/sqlalchemy-continuum which is an easy way to get versioning table for your corresponding table. Minimum lines of code and captures history for add, delete and update.



                                                                                                                                                      This serves more than just is_deleted column. You can always backref version table to check what happened with this entry. Whether entry got deleted, updated or added.



                                                                                                                                                      This way we didn't need to have is_deleted column at all and our delete function was pretty trivial. This way we also don't need to remember to mark is_deleted=False in any of our api's.






                                                                                                                                                      share|improve this answer















                                                                                                                                                      To reply to Tohid's comment, we faced same problem where we wanted to persist history of records and also we were not sure whether we wanted is_deleted column or not.



                                                                                                                                                      I am talking about our python implementation and a similar use-case we hit.



                                                                                                                                                      We encountered https://github.com/kvesteri/sqlalchemy-continuum which is an easy way to get versioning table for your corresponding table. Minimum lines of code and captures history for add, delete and update.



                                                                                                                                                      This serves more than just is_deleted column. You can always backref version table to check what happened with this entry. Whether entry got deleted, updated or added.



                                                                                                                                                      This way we didn't need to have is_deleted column at all and our delete function was pretty trivial. This way we also don't need to remember to mark is_deleted=False in any of our api's.







                                                                                                                                                      share|improve this answer














                                                                                                                                                      share|improve this answer



                                                                                                                                                      share|improve this answer








                                                                                                                                                      edited Sep 8 '17 at 23:59

























                                                                                                                                                      answered Sep 8 '17 at 2:54









                                                                                                                                                      LalitLalit

                                                                                                                                                      195




                                                                                                                                                      195























                                                                                                                                                          1














                                                                                                                                                          It's 2018, and one big disadvantage of soft delete is:



                                                                                                                                                          GDPR compliance



                                                                                                                                                          Your application is probably not GDPR-compliant if you do soft deletes on anything that is considered personal data. [1][2]



                                                                                                                                                          Also keep in mind that, even if your company is not located within EU, as long as you're dealing with EU businesses’, residents’, or citizens’ data, you will have to comply with the GDPR. [3]






                                                                                                                                                          share|improve this answer




























                                                                                                                                                            1














                                                                                                                                                            It's 2018, and one big disadvantage of soft delete is:



                                                                                                                                                            GDPR compliance



                                                                                                                                                            Your application is probably not GDPR-compliant if you do soft deletes on anything that is considered personal data. [1][2]



                                                                                                                                                            Also keep in mind that, even if your company is not located within EU, as long as you're dealing with EU businesses’, residents’, or citizens’ data, you will have to comply with the GDPR. [3]






                                                                                                                                                            share|improve this answer


























                                                                                                                                                              1












                                                                                                                                                              1








                                                                                                                                                              1







                                                                                                                                                              It's 2018, and one big disadvantage of soft delete is:



                                                                                                                                                              GDPR compliance



                                                                                                                                                              Your application is probably not GDPR-compliant if you do soft deletes on anything that is considered personal data. [1][2]



                                                                                                                                                              Also keep in mind that, even if your company is not located within EU, as long as you're dealing with EU businesses’, residents’, or citizens’ data, you will have to comply with the GDPR. [3]






                                                                                                                                                              share|improve this answer













                                                                                                                                                              It's 2018, and one big disadvantage of soft delete is:



                                                                                                                                                              GDPR compliance



                                                                                                                                                              Your application is probably not GDPR-compliant if you do soft deletes on anything that is considered personal data. [1][2]



                                                                                                                                                              Also keep in mind that, even if your company is not located within EU, as long as you're dealing with EU businesses’, residents’, or citizens’ data, you will have to comply with the GDPR. [3]







                                                                                                                                                              share|improve this answer












                                                                                                                                                              share|improve this answer



                                                                                                                                                              share|improve this answer










                                                                                                                                                              answered Jul 26 '18 at 3:09









                                                                                                                                                              zypA13510zypA13510

                                                                                                                                                              201113




                                                                                                                                                              201113























                                                                                                                                                                  0














                                                                                                                                                                  Soft Delete is a programming practice that being followed in most of the application when data is more relevant. Consider a case of financial application where a delete by the mistake of the end user can be fatal.
                                                                                                                                                                  That is the case when soft delete becomes relevant. In soft delete the user is not actually deleting the data from the record instead its being flagged as IsDeleted to true (By normal convention).



                                                                                                                                                                  In EF 6.x or EF 7 onward Softdelete is Added as an attribute but we have to create a custom attribute for the time being now.



                                                                                                                                                                  I strongly recommend SoftDelete In a database design and its a good convention for the programming practice.






                                                                                                                                                                  share|improve this answer




























                                                                                                                                                                    0














                                                                                                                                                                    Soft Delete is a programming practice that being followed in most of the application when data is more relevant. Consider a case of financial application where a delete by the mistake of the end user can be fatal.
                                                                                                                                                                    That is the case when soft delete becomes relevant. In soft delete the user is not actually deleting the data from the record instead its being flagged as IsDeleted to true (By normal convention).



                                                                                                                                                                    In EF 6.x or EF 7 onward Softdelete is Added as an attribute but we have to create a custom attribute for the time being now.



                                                                                                                                                                    I strongly recommend SoftDelete In a database design and its a good convention for the programming practice.






                                                                                                                                                                    share|improve this answer


























                                                                                                                                                                      0












                                                                                                                                                                      0








                                                                                                                                                                      0







                                                                                                                                                                      Soft Delete is a programming practice that being followed in most of the application when data is more relevant. Consider a case of financial application where a delete by the mistake of the end user can be fatal.
                                                                                                                                                                      That is the case when soft delete becomes relevant. In soft delete the user is not actually deleting the data from the record instead its being flagged as IsDeleted to true (By normal convention).



                                                                                                                                                                      In EF 6.x or EF 7 onward Softdelete is Added as an attribute but we have to create a custom attribute for the time being now.



                                                                                                                                                                      I strongly recommend SoftDelete In a database design and its a good convention for the programming practice.






                                                                                                                                                                      share|improve this answer













                                                                                                                                                                      Soft Delete is a programming practice that being followed in most of the application when data is more relevant. Consider a case of financial application where a delete by the mistake of the end user can be fatal.
                                                                                                                                                                      That is the case when soft delete becomes relevant. In soft delete the user is not actually deleting the data from the record instead its being flagged as IsDeleted to true (By normal convention).



                                                                                                                                                                      In EF 6.x or EF 7 onward Softdelete is Added as an attribute but we have to create a custom attribute for the time being now.



                                                                                                                                                                      I strongly recommend SoftDelete In a database design and its a good convention for the programming practice.







                                                                                                                                                                      share|improve this answer












                                                                                                                                                                      share|improve this answer



                                                                                                                                                                      share|improve this answer










                                                                                                                                                                      answered Nov 14 '14 at 7:40









                                                                                                                                                                      Sanu AntonySanu Antony

                                                                                                                                                                      353414




                                                                                                                                                                      353414























                                                                                                                                                                          0














                                                                                                                                                                          Well! As everyone said, it depends on the situation.



                                                                                                                                                                          If you have an index on a column like UserName or EmailID - and you never expect the same UserName or EmailID to be used again; you can go with a soft delete.



                                                                                                                                                                          That said, always check if your SELECT operation uses the primary key. If your SELECT statement uses a primary key, adding a flag with the WHERE clause wouldn't make much difference. Let's take an example (Pseudo):



                                                                                                                                                                          Table Users (UserID [primary key], EmailID, IsDeleted)



                                                                                                                                                                          SELECT * FROM Users where UserID = 123456 and IsDeleted = 0



                                                                                                                                                                          This query won't make any difference in terms of performance since UserID column has a primary key. Initially it will scan the table based on PK and then execute the next condition.



                                                                                                                                                                          Cases where soft deletes cannot work at all:



                                                                                                                                                                          Sign-up in majorly all websites take EmailID as your unique identification. We know very well, once an EmailID is used on a website like facebook, G+, it cannot be used by anyone else.



                                                                                                                                                                          There comes a day, when the user wants to delete his/her profile from the website. Now, if you make a logical delete, that user won't be able to register ever again. Also, registering again using the same EmailID wouldn't mean to restore the entire history. Everyone knows, deletion means deletion. In such scenarios, we have to make a physical delete. But in order to maintain the entire history of the account, we should always archive such records in either archive tables or deleted tables.



                                                                                                                                                                          Yes, in situations where we have lots of foreign tables, handling is quite cumbersome.



                                                                                                                                                                          Also keep in mind that soft/logical deletes will increase your table size, so the index size.






                                                                                                                                                                          share|improve this answer




























                                                                                                                                                                            0














                                                                                                                                                                            Well! As everyone said, it depends on the situation.



                                                                                                                                                                            If you have an index on a column like UserName or EmailID - and you never expect the same UserName or EmailID to be used again; you can go with a soft delete.



                                                                                                                                                                            That said, always check if your SELECT operation uses the primary key. If your SELECT statement uses a primary key, adding a flag with the WHERE clause wouldn't make much difference. Let's take an example (Pseudo):



                                                                                                                                                                            Table Users (UserID [primary key], EmailID, IsDeleted)



                                                                                                                                                                            SELECT * FROM Users where UserID = 123456 and IsDeleted = 0



                                                                                                                                                                            This query won't make any difference in terms of performance since UserID column has a primary key. Initially it will scan the table based on PK and then execute the next condition.



                                                                                                                                                                            Cases where soft deletes cannot work at all:



                                                                                                                                                                            Sign-up in majorly all websites take EmailID as your unique identification. We know very well, once an EmailID is used on a website like facebook, G+, it cannot be used by anyone else.



                                                                                                                                                                            There comes a day, when the user wants to delete his/her profile from the website. Now, if you make a logical delete, that user won't be able to register ever again. Also, registering again using the same EmailID wouldn't mean to restore the entire history. Everyone knows, deletion means deletion. In such scenarios, we have to make a physical delete. But in order to maintain the entire history of the account, we should always archive such records in either archive tables or deleted tables.



                                                                                                                                                                            Yes, in situations where we have lots of foreign tables, handling is quite cumbersome.



                                                                                                                                                                            Also keep in mind that soft/logical deletes will increase your table size, so the index size.






                                                                                                                                                                            share|improve this answer


























                                                                                                                                                                              0












                                                                                                                                                                              0








                                                                                                                                                                              0







                                                                                                                                                                              Well! As everyone said, it depends on the situation.



                                                                                                                                                                              If you have an index on a column like UserName or EmailID - and you never expect the same UserName or EmailID to be used again; you can go with a soft delete.



                                                                                                                                                                              That said, always check if your SELECT operation uses the primary key. If your SELECT statement uses a primary key, adding a flag with the WHERE clause wouldn't make much difference. Let's take an example (Pseudo):



                                                                                                                                                                              Table Users (UserID [primary key], EmailID, IsDeleted)



                                                                                                                                                                              SELECT * FROM Users where UserID = 123456 and IsDeleted = 0



                                                                                                                                                                              This query won't make any difference in terms of performance since UserID column has a primary key. Initially it will scan the table based on PK and then execute the next condition.



                                                                                                                                                                              Cases where soft deletes cannot work at all:



                                                                                                                                                                              Sign-up in majorly all websites take EmailID as your unique identification. We know very well, once an EmailID is used on a website like facebook, G+, it cannot be used by anyone else.



                                                                                                                                                                              There comes a day, when the user wants to delete his/her profile from the website. Now, if you make a logical delete, that user won't be able to register ever again. Also, registering again using the same EmailID wouldn't mean to restore the entire history. Everyone knows, deletion means deletion. In such scenarios, we have to make a physical delete. But in order to maintain the entire history of the account, we should always archive such records in either archive tables or deleted tables.



                                                                                                                                                                              Yes, in situations where we have lots of foreign tables, handling is quite cumbersome.



                                                                                                                                                                              Also keep in mind that soft/logical deletes will increase your table size, so the index size.






                                                                                                                                                                              share|improve this answer













                                                                                                                                                                              Well! As everyone said, it depends on the situation.



                                                                                                                                                                              If you have an index on a column like UserName or EmailID - and you never expect the same UserName or EmailID to be used again; you can go with a soft delete.



                                                                                                                                                                              That said, always check if your SELECT operation uses the primary key. If your SELECT statement uses a primary key, adding a flag with the WHERE clause wouldn't make much difference. Let's take an example (Pseudo):



                                                                                                                                                                              Table Users (UserID [primary key], EmailID, IsDeleted)



                                                                                                                                                                              SELECT * FROM Users where UserID = 123456 and IsDeleted = 0



                                                                                                                                                                              This query won't make any difference in terms of performance since UserID column has a primary key. Initially it will scan the table based on PK and then execute the next condition.



                                                                                                                                                                              Cases where soft deletes cannot work at all:



                                                                                                                                                                              Sign-up in majorly all websites take EmailID as your unique identification. We know very well, once an EmailID is used on a website like facebook, G+, it cannot be used by anyone else.



                                                                                                                                                                              There comes a day, when the user wants to delete his/her profile from the website. Now, if you make a logical delete, that user won't be able to register ever again. Also, registering again using the same EmailID wouldn't mean to restore the entire history. Everyone knows, deletion means deletion. In such scenarios, we have to make a physical delete. But in order to maintain the entire history of the account, we should always archive such records in either archive tables or deleted tables.



                                                                                                                                                                              Yes, in situations where we have lots of foreign tables, handling is quite cumbersome.



                                                                                                                                                                              Also keep in mind that soft/logical deletes will increase your table size, so the index size.







                                                                                                                                                                              share|improve this answer












                                                                                                                                                                              share|improve this answer



                                                                                                                                                                              share|improve this answer










                                                                                                                                                                              answered Jun 20 '15 at 14:12









                                                                                                                                                                              JitenJiten

                                                                                                                                                                              14714




                                                                                                                                                                              14714























                                                                                                                                                                                  0














                                                                                                                                                                                  Most of time softdeleting is used because you don't want to expose some data but you have to keep it for historical reasons (A product could become discontinued, so you don't want any new transaction with it but you still need to work with the history of sale transaction). By the way, some are copying the product information value in the sale transaction data instead of making a reference to the product to handle this.



                                                                                                                                                                                  In fact it looks more like a rewording for a visible/hidden or active/inactive feature. Because that's the meaning of "delete" in business world. I'd like to say that Terminators may delete people but boss just fire them.



                                                                                                                                                                                  This practice is pretty common pattern and used by a lot of application for a lot of reasons. As It's not the only way to achieve this, so you will have thousand of people saying that's great or bullshit and both have pretty good arguments.



                                                                                                                                                                                  From a point of view of security, SoftDelete won't replace the job of Audit and it won't replace the job of backup too. If you are afraid of "the insert/delete between two backup case", you should read about Full or Bulk recovery Models. I admit that SoftDelete could make the recovery process more trivial.



                                                                                                                                                                                  Up to you to know your requirement.






                                                                                                                                                                                  share|improve this answer




























                                                                                                                                                                                    0














                                                                                                                                                                                    Most of time softdeleting is used because you don't want to expose some data but you have to keep it for historical reasons (A product could become discontinued, so you don't want any new transaction with it but you still need to work with the history of sale transaction). By the way, some are copying the product information value in the sale transaction data instead of making a reference to the product to handle this.



                                                                                                                                                                                    In fact it looks more like a rewording for a visible/hidden or active/inactive feature. Because that's the meaning of "delete" in business world. I'd like to say that Terminators may delete people but boss just fire them.



                                                                                                                                                                                    This practice is pretty common pattern and used by a lot of application for a lot of reasons. As It's not the only way to achieve this, so you will have thousand of people saying that's great or bullshit and both have pretty good arguments.



                                                                                                                                                                                    From a point of view of security, SoftDelete won't replace the job of Audit and it won't replace the job of backup too. If you are afraid of "the insert/delete between two backup case", you should read about Full or Bulk recovery Models. I admit that SoftDelete could make the recovery process more trivial.



                                                                                                                                                                                    Up to you to know your requirement.






                                                                                                                                                                                    share|improve this answer


























                                                                                                                                                                                      0












                                                                                                                                                                                      0








                                                                                                                                                                                      0







                                                                                                                                                                                      Most of time softdeleting is used because you don't want to expose some data but you have to keep it for historical reasons (A product could become discontinued, so you don't want any new transaction with it but you still need to work with the history of sale transaction). By the way, some are copying the product information value in the sale transaction data instead of making a reference to the product to handle this.



                                                                                                                                                                                      In fact it looks more like a rewording for a visible/hidden or active/inactive feature. Because that's the meaning of "delete" in business world. I'd like to say that Terminators may delete people but boss just fire them.



                                                                                                                                                                                      This practice is pretty common pattern and used by a lot of application for a lot of reasons. As It's not the only way to achieve this, so you will have thousand of people saying that's great or bullshit and both have pretty good arguments.



                                                                                                                                                                                      From a point of view of security, SoftDelete won't replace the job of Audit and it won't replace the job of backup too. If you are afraid of "the insert/delete between two backup case", you should read about Full or Bulk recovery Models. I admit that SoftDelete could make the recovery process more trivial.



                                                                                                                                                                                      Up to you to know your requirement.






                                                                                                                                                                                      share|improve this answer













                                                                                                                                                                                      Most of time softdeleting is used because you don't want to expose some data but you have to keep it for historical reasons (A product could become discontinued, so you don't want any new transaction with it but you still need to work with the history of sale transaction). By the way, some are copying the product information value in the sale transaction data instead of making a reference to the product to handle this.



                                                                                                                                                                                      In fact it looks more like a rewording for a visible/hidden or active/inactive feature. Because that's the meaning of "delete" in business world. I'd like to say that Terminators may delete people but boss just fire them.



                                                                                                                                                                                      This practice is pretty common pattern and used by a lot of application for a lot of reasons. As It's not the only way to achieve this, so you will have thousand of people saying that's great or bullshit and both have pretty good arguments.



                                                                                                                                                                                      From a point of view of security, SoftDelete won't replace the job of Audit and it won't replace the job of backup too. If you are afraid of "the insert/delete between two backup case", you should read about Full or Bulk recovery Models. I admit that SoftDelete could make the recovery process more trivial.



                                                                                                                                                                                      Up to you to know your requirement.







                                                                                                                                                                                      share|improve this answer












                                                                                                                                                                                      share|improve this answer



                                                                                                                                                                                      share|improve this answer










                                                                                                                                                                                      answered Sep 19 '17 at 14:34









                                                                                                                                                                                      Marco GuignardMarco Guignard

                                                                                                                                                                                      41228




                                                                                                                                                                                      41228























                                                                                                                                                                                          0














                                                                                                                                                                                          To give an alternative, we have users using remote devices updating via MobiLink. If we delete records in the server database, those records never get marked deleted in the client databases.



                                                                                                                                                                                          So we do both. We work with our clients to determine how long they wish to be able to recover data. For example, generally customers and products are active until our client say they should be deleted, but history of sales is only retained for 13 months and then deletes automatically. The client may want to keep deleted customers and products for two months but retain history for six months.



                                                                                                                                                                                          So we run a script overnight that marks things logically deleted according to these parameters and then two/six months later, anything marked logically deleted today will be hard deleted.



                                                                                                                                                                                          We're less about data security than about having enormous databases on a client device with limited memory, such as a smartphone. A client who orders 200 products twice a week for four years will have over 81,000 lines of history, of which 75% the client doesn't care if he sees.






                                                                                                                                                                                          share|improve this answer




























                                                                                                                                                                                            0














                                                                                                                                                                                            To give an alternative, we have users using remote devices updating via MobiLink. If we delete records in the server database, those records never get marked deleted in the client databases.



                                                                                                                                                                                            So we do both. We work with our clients to determine how long they wish to be able to recover data. For example, generally customers and products are active until our client say they should be deleted, but history of sales is only retained for 13 months and then deletes automatically. The client may want to keep deleted customers and products for two months but retain history for six months.



                                                                                                                                                                                            So we run a script overnight that marks things logically deleted according to these parameters and then two/six months later, anything marked logically deleted today will be hard deleted.



                                                                                                                                                                                            We're less about data security than about having enormous databases on a client device with limited memory, such as a smartphone. A client who orders 200 products twice a week for four years will have over 81,000 lines of history, of which 75% the client doesn't care if he sees.






                                                                                                                                                                                            share|improve this answer


























                                                                                                                                                                                              0












                                                                                                                                                                                              0








                                                                                                                                                                                              0







                                                                                                                                                                                              To give an alternative, we have users using remote devices updating via MobiLink. If we delete records in the server database, those records never get marked deleted in the client databases.



                                                                                                                                                                                              So we do both. We work with our clients to determine how long they wish to be able to recover data. For example, generally customers and products are active until our client say they should be deleted, but history of sales is only retained for 13 months and then deletes automatically. The client may want to keep deleted customers and products for two months but retain history for six months.



                                                                                                                                                                                              So we run a script overnight that marks things logically deleted according to these parameters and then two/six months later, anything marked logically deleted today will be hard deleted.



                                                                                                                                                                                              We're less about data security than about having enormous databases on a client device with limited memory, such as a smartphone. A client who orders 200 products twice a week for four years will have over 81,000 lines of history, of which 75% the client doesn't care if he sees.






                                                                                                                                                                                              share|improve this answer













                                                                                                                                                                                              To give an alternative, we have users using remote devices updating via MobiLink. If we delete records in the server database, those records never get marked deleted in the client databases.



                                                                                                                                                                                              So we do both. We work with our clients to determine how long they wish to be able to recover data. For example, generally customers and products are active until our client say they should be deleted, but history of sales is only retained for 13 months and then deletes automatically. The client may want to keep deleted customers and products for two months but retain history for six months.



                                                                                                                                                                                              So we run a script overnight that marks things logically deleted according to these parameters and then two/six months later, anything marked logically deleted today will be hard deleted.



                                                                                                                                                                                              We're less about data security than about having enormous databases on a client device with limited memory, such as a smartphone. A client who orders 200 products twice a week for four years will have over 81,000 lines of history, of which 75% the client doesn't care if he sees.







                                                                                                                                                                                              share|improve this answer












                                                                                                                                                                                              share|improve this answer



                                                                                                                                                                                              share|improve this answer










                                                                                                                                                                                              answered Feb 9 '18 at 21:35









                                                                                                                                                                                              TychaBraheTychaBrahe

                                                                                                                                                                                              12




                                                                                                                                                                                              12























                                                                                                                                                                                                  0














                                                                                                                                                                                                  It all depends on the use case of the system and its data.



                                                                                                                                                                                                  For example, if you are talking about a government regulated system (e.g. a system at a pharmaceutical company that is considered a part of the quality system and must follow FDA guidelines for electronic records), then you darned well better not do hard deletes! An auditor from the FDA can come in and ask for all records in the system relating to product number ABC-123, and all data better be available. If your business process owner says the system shouldn't allow anyone to use product number ABC-123 on new records going forward, use the soft-delete method instead to make it "inactive" within the system, while still preserving historical data.



                                                                                                                                                                                                  However, maybe your system and its data has a use case such as "tracking the weather at the North Pole". Maybe you take temperature readings once every hour, and at the end of the day aggregate a daily average. Maybe the hourly data will no longer ever be used after aggregation, and you'd hard-delete the hourly readings after creating the aggregate. (This is a made-up, trivial example.)



                                                                                                                                                                                                  The point is, it all depends on the use case of the system and its data, and not a decision to be made purely from a technological standpoint.






                                                                                                                                                                                                  share|improve this answer






























                                                                                                                                                                                                    0














                                                                                                                                                                                                    It all depends on the use case of the system and its data.



                                                                                                                                                                                                    For example, if you are talking about a government regulated system (e.g. a system at a pharmaceutical company that is considered a part of the quality system and must follow FDA guidelines for electronic records), then you darned well better not do hard deletes! An auditor from the FDA can come in and ask for all records in the system relating to product number ABC-123, and all data better be available. If your business process owner says the system shouldn't allow anyone to use product number ABC-123 on new records going forward, use the soft-delete method instead to make it "inactive" within the system, while still preserving historical data.



                                                                                                                                                                                                    However, maybe your system and its data has a use case such as "tracking the weather at the North Pole". Maybe you take temperature readings once every hour, and at the end of the day aggregate a daily average. Maybe the hourly data will no longer ever be used after aggregation, and you'd hard-delete the hourly readings after creating the aggregate. (This is a made-up, trivial example.)



                                                                                                                                                                                                    The point is, it all depends on the use case of the system and its data, and not a decision to be made purely from a technological standpoint.






                                                                                                                                                                                                    share|improve this answer




























                                                                                                                                                                                                      0












                                                                                                                                                                                                      0








                                                                                                                                                                                                      0







                                                                                                                                                                                                      It all depends on the use case of the system and its data.



                                                                                                                                                                                                      For example, if you are talking about a government regulated system (e.g. a system at a pharmaceutical company that is considered a part of the quality system and must follow FDA guidelines for electronic records), then you darned well better not do hard deletes! An auditor from the FDA can come in and ask for all records in the system relating to product number ABC-123, and all data better be available. If your business process owner says the system shouldn't allow anyone to use product number ABC-123 on new records going forward, use the soft-delete method instead to make it "inactive" within the system, while still preserving historical data.



                                                                                                                                                                                                      However, maybe your system and its data has a use case such as "tracking the weather at the North Pole". Maybe you take temperature readings once every hour, and at the end of the day aggregate a daily average. Maybe the hourly data will no longer ever be used after aggregation, and you'd hard-delete the hourly readings after creating the aggregate. (This is a made-up, trivial example.)



                                                                                                                                                                                                      The point is, it all depends on the use case of the system and its data, and not a decision to be made purely from a technological standpoint.






                                                                                                                                                                                                      share|improve this answer















                                                                                                                                                                                                      It all depends on the use case of the system and its data.



                                                                                                                                                                                                      For example, if you are talking about a government regulated system (e.g. a system at a pharmaceutical company that is considered a part of the quality system and must follow FDA guidelines for electronic records), then you darned well better not do hard deletes! An auditor from the FDA can come in and ask for all records in the system relating to product number ABC-123, and all data better be available. If your business process owner says the system shouldn't allow anyone to use product number ABC-123 on new records going forward, use the soft-delete method instead to make it "inactive" within the system, while still preserving historical data.



                                                                                                                                                                                                      However, maybe your system and its data has a use case such as "tracking the weather at the North Pole". Maybe you take temperature readings once every hour, and at the end of the day aggregate a daily average. Maybe the hourly data will no longer ever be used after aggregation, and you'd hard-delete the hourly readings after creating the aggregate. (This is a made-up, trivial example.)



                                                                                                                                                                                                      The point is, it all depends on the use case of the system and its data, and not a decision to be made purely from a technological standpoint.







                                                                                                                                                                                                      share|improve this answer














                                                                                                                                                                                                      share|improve this answer



                                                                                                                                                                                                      share|improve this answer








                                                                                                                                                                                                      edited Nov 16 '18 at 1:59









                                                                                                                                                                                                      Pang

                                                                                                                                                                                                      6,9791666105




                                                                                                                                                                                                      6,9791666105










                                                                                                                                                                                                      answered Apr 13 '18 at 19:19









                                                                                                                                                                                                      HardCodeHardCode

                                                                                                                                                                                                      4,95822650




                                                                                                                                                                                                      4,95822650






























                                                                                                                                                                                                          draft saved

                                                                                                                                                                                                          draft discarded




















































                                                                                                                                                                                                          Thanks for contributing an answer to Stack Overflow!


                                                                                                                                                                                                          • Please be sure to answer the question. Provide details and share your research!

                                                                                                                                                                                                          But avoid



                                                                                                                                                                                                          • Asking for help, clarification, or responding to other answers.

                                                                                                                                                                                                          • Making statements based on opinion; back them up with references or personal experience.


                                                                                                                                                                                                          To learn more, see our tips on writing great answers.




                                                                                                                                                                                                          draft saved


                                                                                                                                                                                                          draft discarded














                                                                                                                                                                                                          StackExchange.ready(
                                                                                                                                                                                                          function () {
                                                                                                                                                                                                          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f378331%2fphysical-vs-logical-soft-delete-of-database-record%23new-answer', 'question_page');
                                                                                                                                                                                                          }
                                                                                                                                                                                                          );

                                                                                                                                                                                                          Post as a guest















                                                                                                                                                                                                          Required, but never shown





















































                                                                                                                                                                                                          Required, but never shown














                                                                                                                                                                                                          Required, but never shown












                                                                                                                                                                                                          Required, but never shown







                                                                                                                                                                                                          Required, but never shown

































                                                                                                                                                                                                          Required, but never shown














                                                                                                                                                                                                          Required, but never shown












                                                                                                                                                                                                          Required, but never shown







                                                                                                                                                                                                          Required, but never shown







                                                                                                                                                                                                          Popular posts from this blog

                                                                                                                                                                                                          Xamarin.iOS Cant Deploy on Iphone

                                                                                                                                                                                                          Glorious Revolution

                                                                                                                                                                                                          Dulmage-Mendelsohn matrix decomposition in Python