w3schools subselect database database-design derived-table

database - subselect - subquery w3schools



¿Saldo de cuenta derivado vs. saldo de cuenta almacenado para una cuenta bancaria simple? (2)

Por lo tanto, es como nuestras cuentas bancarias normales donde tenemos muchas transacciones que resultan en la entrada o salida de dinero. El saldo de la cuenta siempre se puede derivar simplemente sumando los valores de transacción. ¿Qué sería mejor en este caso, almacenar el saldo de cuenta actualizado en la base de datos o volver a calcularlo cuando sea necesario?

Volumen esperado de transacciones por cuenta: <5 por día

Recuperación esperada del saldo de la cuenta: siempre que una transacción ocurra y una vez al día en un promedio de lo contrario.

¿Cómo sugieres tomar una decisión al respecto? ¡Muchas gracias!


Prefacio

Esta es la era de la "verdad" subjetiva, y la verdad objetiva, que fluye de una Autoridad y que ha estado vigente durante cuatro mil años, es algo contra lo que ahora estamos programados para rebelarnos.

He trabajado en sistemas contables durante 34 años y en sistemas bancarios durante 24 años. Hay una verdad objetiva: requisitos de auditoría. Además, cuando se trata de fondos públicos, hay una Legislatura que debe cumplirse.

No tiene que implementar el requisito contable completo, puede implementar solo las partes que necesita.

A la inversa, no sería aconsejable implementar algo que no sea el requisito de contabilidad estándar (sus partes) porque eso garantiza que cuando el número de errores o la carga exceda algún umbral, o el sistema se expanda, tendrá que volver a implementar . Un costo que puede, y por lo tanto, debe ser evitado.

También debe indicarse: no contrate a un "auditor" no calificado, no acreditado (por una Autoridad). Eso es (a) un acto de rebelión contra la Autoridad, y (b) habrá consecuencias, al igual que si contratara a un desarrollador no calificado. Podría ser peor, si la autoridad superior, como la Oficina de Impuestos, le impone una multa.

Por lo tanto, tenga en cuenta la jerarquía de Autoridades y cumpla con la más alta. Eso asegura una vida pacífica. Eso garantiza que automáticamente, sin esfuerzo adicional, cumpla con cualquier autoridad inferior. Si no lo haces, es decir. cumplir con alguna Autoridad inferior, pero rebelarse contra otra superior, la Autoridad superior te pondrá al final.

Método

El método de contabilidad estándar en países no tan primitivos es el siguiente. La "mejor práctica", por así decirlo, en otros.

Este método se aplica a cualquier sistema que tenga operaciones similares; necesariamente; cifras mensuales históricas frente a los requisitos del mes en curso, como el control de inventario, etc.

Consideración

Primero, las consideraciones.

  1. Nunca duplique los datos. Si se puede derivar el saldo actual (y aquí es simple), no lo duplique con una columna de resumen. Tal columna es una duplicación de datos. Se rompen las reglas de normalización. Además, crea una anomalía de actualización, que de lo contrario no existe.

  2. Si usa una columna de resumen, cada vez que se actualizan las Transacciones (como se modificó, no como cuando se inserta una nueva Transacción), el valor de la columna de resumen se vuelve obsoleto, por lo que debe actualizarse todo el tiempo. Esa es la consecuencia de la Actualización Anomalía. Lo que elimina el valor de tenerlo.

  3. Publicación externa. Si el saldo se publica, como en un extracto bancario mensual, tales documentos generalmente tienen restricciones e implicaciones legales, por lo que el valor de CurrentBalance publicado no debe cambiar después de la publicación.

    • Cualquier cambio, posterior a la fecha de publicación, en la base de datos, de una figura que se publica externamente, es evidencia de conducta deshonesta, fraude, etc.

      • Tal acto, que intenta cambiar la historia publicada, es el sello distintivo de un novato. Los principiantes y los enfermos mentales insistirán en que se puede cambiar la historia. Pero como todos deben saber, la ignorancia de la ley no constituye una defensa válida.
    • No querría que su banco, en abril de 2015, cambie su saldo actual que le publicaron en su estado de cuenta bancario de diciembre de 2014.

    • Esa figura debe verse como una figura de auditoría, publicada e invariable.

  4. Todas las correcciones o ajustes que sean necesarios se realizan como nuevas transacciones en el mes actual, aunque se aplique a algún mes anterior. Esto se debe a que el mes aplicable se cierra y publica, porque no se puede cambiar el historial después de que haya ocurrido y se haya registrado. El único mes efectivo es el actual.

    • Para los sistemas que generan intereses, etc., en países no tan primitivos, cuando se encuentra un error, y tiene un efecto histórico (por ejemplo, en abril de 2015 descubrió que los intereses calculados sobre un valor han sido incorrectos, desde diciembre 2014), el valor del pago / deducción de intereses corregidos se calcula hoy, para el número de días en los que hubo un error, y la suma se inserta como una Transacción en el mes actual. Nuevamente, el único mes efectivo es el actual.

      Y, por supuesto, la tasa de interés de la seguridad también debe corregirse, para que el error no se repita.

    • Si encuentra un error en el cálculo de los intereses de su banco en su Cuenta de Ahorros (que devenga intereses) y lo corrige, obtiene un depósito único, que constituye el valor de ajuste completo, en el mes actual. Esa es una transacción en el mes actual.

      El banco no: cambia la historia; aplicar interés por cada uno de los meses históricos; recordar los estados bancarios históricos; volver a publicar los estados bancarios históricos. No. Excepto tal vez en los países del tipo Idi Amin.

    • Los mismos principios se aplican a los sistemas de control de inventario. Mantiene la cordura.

  5. Todos los sistemas de contabilidad reales (es decir, aquellos que están acreditados por la Autoridad de Auditoría en el país correspondiente, a diferencia de los "paquetes" de Mickey Mouse que abundan) utilizan un sistema de Entrada Doble para Transacciones, precisamente porque evita una serie de errores, el Lo más importante es que los fondos no se "pierden". Eso requiere un simple libro mayor.

    • Probablemente no necesite eso, por lo tanto, no lo estoy describiendo aquí, pero recuérdelo en caso de que el dinero se "pierda", porque eso es lo que tendrá que implementar, no una solución de curita; no es otro "paquete" no acreditado.
  6. Los principales problemas que afectan el rendimiento están fuera del alcance de esta pregunta, están en el área de si implementa una base de datos relacional genuina o no (un sistema de archivo de registros en un contenedor de base de datos SQL, tipificado por ID).

    • El uso de claves relacionales genuinas, etc., mantendrá un alto rendimiento, independientemente de la población de las tablas.

    • Por el contrario, un RFS tendrá un mal desempeño, simplemente no puede realizar. "Escala" cuando se usa en el contexto de un RFS, es un término fraudulento: oculta la causa y trata de abordar todo menos la causa.

Implementación

  1. Para cada Cuenta, habrá un ClosingBalance, en una tabla de Estado de Cuenta (una fila por Cuenta por mes), junto con StatementDate y otros detalles del Estado de Cuenta.

    • Esto no es un duplicado porque se exige con fines de auditoría y cordura.

      Para el inventario, una columna QuantityOnHand, en la tabla PartAudit (una fila por parte por mes)

    • Tiene un valor adicional, ya que restringe el alcance de las filas de la transacción que deben consultarse para el mes actual

      • Nuevamente, si su tabla es Relacional, la Clave principal para AccountTransaction será (AccountCode, TransactionDateTime) que recuperará las Transacciones a velocidades de milisegundos.

      • Mientras que para un sistema de archivo de registro, la "clave principal" será (TransactionID), y recuperará el mes actual mediante TransactionDate, que puede o no estar indexado correctamente, y las filas requeridas se repartirán en todo el archivo. En cualquier caso, a una velocidad mucho menor que ClusteredIndex, y donde las filas recuperadas son muchas, un tablescan.

  2. La tabla de transacciones sigue siendo simple (la noción real de una transacción bancaria es simple). Tiene una única columna de cantidad positiva.

  3. Para cada Cuenta, el Balance Actual es:

    • El Balance de Cierre del mes anterior.

      (para el inventario, el PartAudit.QuantityOnHand)

    • más la suma de la transacción. Se acumula en el mes actual, donde el tipo de transacción indica un depósito

      (para el inventario, la Transaction.QuantityAffected)

    • menos la suma de la transacción. Se acumula en el mes actual, donde el tipo de transacción indica un retiro

  4. En este Método, las Transacciones en el mes actual, solo, están en un estado de flujo, por lo tanto, deben derivarse. Todos los meses anteriores se publican y cierran, por lo que se debe utilizar la cifra de auditoría.

  5. Las filas más antiguas en la tabla de transacciones se pueden purgar. Más de diez años para dinero público, cinco años de lo contrario, un año para sistemas de clubes de hobby.

  6. Por supuesto, es esencial que cualquier código relacionado con los sistemas de contabilidad utilice estándares OLTP genuinos y transacciones ACID SQL genuinas.

  7. Este diseño incorpora todas las consideraciones de rendimiento a nivel de alcance (si esto no es obvio, solicite una expansión). La escala no es un problema, ahora los problemas de escala son honestamente fuera de la base de datos.

Asesoramiento correctivo

Estos elementos deben declararse solo porque se proporcionaron consejos incorrectos en las Respuestas de SO (y, por supuesto, democráticamente, las votaron a favor de las masas), e Internet está repleto de consejos incorrectos (a los aficionados les encanta publicar sus "verdades subjetivas" "):

  1. Evidentemente, algunas personas no entienden que he dado un Método en términos técnicos. Como tal, no es un pseudocódigo para una aplicación específica en un país específico. El Método es para desarrolladores capaces, no es lo suficientemente detallado para aquellos que necesitan ser guiados de la mano.

    • Tampoco entienden que el período de corte de un mes es un ejemplo: si su corte para fines de la Oficina de Impuestos es trimestral, entonces, por todos los medios, use un corte trimestral; Si el único requisito legal que tiene es anual, use anual.

    • Incluso si su corte es trimestral para fines externos o de cumplimiento, la compañía puede elegir un corte mensual, para fines de auditoría interna y de cordura (es decir, para mantener la duración del período de flujo al mínimo) .

      P.ej. en Australia, el corte de la Oficina de Impuestos para empresas es trimestral, pero las compañías más grandes cortan su control de inventario mensualmente (esto evita tener que perseguir errores durante un largo período).

      P.ej. Los bancos tienen requisitos legales de cumplimiento mensual, por lo tanto, realizan una auditoría interna de las cifras y cierran los libros mensualmente.

    • En los países primitivos y en los estados deshonestos, los bancos mantienen su período de estado de flujo al máximo, por obvios propósitos infames. Algunos de ellos solo hacen sus informes de cumplimiento anualmente. Esa es una de las razones por las que los bancos en Australia no fallan.

  2. En la tabla Transacción, no use negativo / positivo en la columna Cantidad. El dinero siempre tiene un valor positivo, no hay nada negativo como veinte dólares (o que me debes menos cincuenta dólares , y luego deduces que los dobles negativos significan otra cosa).

  3. La dirección del movimiento, o lo que va a hacer con los fondos, es un hecho separado y discreto (para la Cantidad de Transacción). Lo que requiere una columna separada (dos hechos en un dato rompe las reglas de Normalización, con la consecuencia de que introduce complejidad en el código).

    • Implemente una columna TransactionType, que es (D, W) para Depósito / Retiro como punto de partida. A medida que el sistema crece, simplemente agregue (A, R, w, M) para Ajuste, Reembolso, ATM_Withdrawal, Management_Fee, etc.

    • No se requieren cambios de código.

  4. En algunos países primitivos, los requisitos de litigio establecen que en cualquier informe que enumere Transacciones, se debe mostrar un total acumulado en cada línea. (Tenga en cuenta que esto no es un requisito de Auditoría porque son superiores al [Método anterior] respecto al requisito de la corte; los Auditores son algo menos estúpidos que los abogados, etc.)

    Obviamente, no discutiría con un requisito de la corte. El problema es que los codificadores primitivos traducen eso en: oh, debemos implementar una columna Transaction.CurrentBalance. No logran entender que:

    • el requisito de imprimir una columna en un informe no es un requisito para almacenar un valor en la base de datos

    • un total acumulado de cualquier tipo es un valor derivado y se codifica fácilmente (publique una pregunta si no es fácil para usted). Simplemente implemente el código requerido en el informe.

    • implementando el total acumulado por ej. Transaction.CurrentBalance como una columna causa problemas horrendos:

      • Introduce una columna duplicada, porque es derivable. Rompe la normalización. Presenta una anomalía de actualización.

      • la anomalía de actualización: cada vez que se inserta históricamente una transacción, o se modifica una cantidad de transacción, se deben volver a calcular y actualizar todos los saldos de la transacción a partir de esa fecha hasta el presente .

    • en el caso anterior, el informe que se presentó para uso del tribunal, ahora está obsoleto (cada informe de datos en línea está obsoleto en el momento de su impresión). Es decir. impresión; revisión; cambiar la transacción; reimprimir; Vuelve a revisar, hasta que estés feliz. No tiene sentido en ningún caso.

    • por eso, en los países menos primitivos, los tribunales no aceptan ningún papel antiguo impreso, solo aceptan las cifras publicadas, por ejemplo. Estados de cuenta bancarios, que ya están sujetos a los requisitos de auditoría (consulte el Método anterior), y que no se pueden recuperar, modificar ni reimprimir.


Esto es bastante subjetivo. Las cosas que sugeriría tomar en cuenta son:

  1. ¿Cuántas cuentas hay actualmente?
  2. ¿Cuántas cuentas espera tener en el futuro?
  3. ¿Cuánto valor le das a la escalabilidad?
  4. ¿Qué tan difícil es actualizar su base de datos y código para rastrear el saldo como su propio campo?
  5. ¿Hay más preocupaciones de desarrollo inmediato que deben ser atendidas?

En términos de los méritos de los dos enfoques propuestos, es probable que sumar los valores de transacción bajo demanda sea más fácil / rápido de implementar.

Sin embargo, no se escalará, sino que también mantendrá el saldo de la cuenta actual como un campo en la base de datos y lo actualizará a medida que avanza. Y aumenta un poco el tiempo total de procesamiento de la transacción, ya que cada transacción debe ejecutar una consulta para calcular el saldo de la cuenta actual antes de que pueda continuar. En la práctica, estas pueden ser pequeñas preocupaciones, a menos que tenga un gran número de cuentas / transacciones o que espere hacerlo en un futuro muy cercano.

La desventaja del segundo enfoque es que probablemente tomará más tiempo / esfuerzo de desarrollo para la configuración inicial, y puede requerir que reflexione sobre cómo sincronizar las transacciones dentro de una cuenta para garantizar que cada uno vea y actualice el saldo con precisión. en todo momento.

Por lo tanto, todo se reduce a cuáles son las necesidades del proyecto, dónde es mejor invertir el tiempo de desarrollo en este momento y si vale la pena probar la solución ahora en lugar de implementar el segundo enfoque más adelante, cuando el rendimiento y la escalabilidad se vuelvan reales, más bien Que teóricos, los problemas.