¿Deberían ser 3 tablas SQL o una?

Esta es una nueva pregunta que surgió de esta pregunta

Debido a las respuestas, la naturaleza de la pregunta cambió, así que creo que publicar una nueva está bien (?).

Puedes ver mi layout de database original a continuación. Tengo 3 tablas, y ahora necesito una consulta para get todos los loggings de un usuario específico para los cálculos de running_balances.

  • Las transactions son entre usuarios, como el crédito mutuo. Por lo tanto, las unidades se intercambian entre los usuarios.
  • Las deviseizaciones son cosas físicas introducidas en el sistema; un usuario obtiene unidades para esto.
  • Los Consumciones son cosas físicas consumidas; un usuario tiene que pagar unidades por esto.
 | ------------------------------------------------- ------------------------- |
 |  tipo |  transactions |  deviseizaciones |  consumos |
 | ------------------------------------------------- ------------------------- |
 |  columnas |  date |  date |  date |
 |  |  acreedor (usuario FK) |  acreedor (usuario FK) |  |
 |  |  deudor (usuario de FK) |  |  deudor (usuario de FK) |
 |  |  service (service FK) |  |  |
 |  |  |  activo (activo FK) |  activo (activo FK) |
 |  |  cantidad |  cantidad |  cantidad |
 |  |  |  |  precio |
 | ------------------------------------------------- ------------------------- |

(Tenga en count que la "cantidad" se encuentra en unidades diferentes, estas son las inputs y los cálculos se realizan en esas cantidades. Fuera del scope para explicar por qué, pero estos son los campos).

La pregunta es: "¿Puedo / debería ser esto en una tabla o ser tablas múltiples (como lo tengo por ahora)?" Me gusta la solución de 3 tablas porque tiene semánticamente más sentido. Pero entonces necesito una sentencia selectiva tan complicada (con resultados de performance posiblemente negativos) para los balances running_. La pregunta original en el enlace anterior solicitó esta statement, aquí estoy preguntando si el layout de db es apropiado (disculpas cuatro publicaciones dobles, espero que esté bien).

Esta misma pregunta surge cuando intenta implementar un sistema de contabilidad general para la contabilidad de input única. Lo que ha llamado "transactions" corresponde a "transferencias", como ahorros o cheques. Lo que ha llamado "deviseizaciones" corresponde a "ingresos", como depositar un cheque de pago. Lo que ha llamado "consumos" corresponde a "gastos", como cuando paga la factura de la luz. La única diferencia es que en la contabilidad, todo se ha networkingucido al valor del dólar (u otra moneda). Entonces, no tiene que preocuparse por identificar activos, porque un dólar es tan bueno como otro.

Entonces surge la pregunta de si necesita tener columnas separadas para "monto de débito" e "importe de crédito" o, alternativamente, si puede tener una sola columna para "monto", e ingrese un número positivo para débitos y un monto negativo para créditos. Esencialmente surge la misma pregunta si está implementando la contabilidad de doble input en lugar de la contabilidad de una sola input.

En términos de aritmética interna y manejo interno de datos, las cosas son mucho más simples cuando adoptas el enfoque de una sola columna. Por ejemplo, para comprobar si una transacción determinada está en equilibrio, todo lo que tiene que hacer es preguntar si la sum (cantidad) es igual a cero.

Las complicaciones surgen cuando las personas requieren el formatting tradicional de bookeeping para formularios de input de datos, recuperaciones de pantalla e informes publicados. El formatting tradicional requiere dos columnas separadas, marcadas "Débito" y "Crédito", que contienen solo numbers positivos o en blanco, con la restricción de que cada elemento debe tener una input en débito o crédito pero no en ambos, y la otra columna debe estar dejado en blanco. Estas transformaciones requieren una cierta cantidad de progtwigción entre el formatting externo y el formatting interno.

Es realmente una cuestión de elección. ¿Es mejor retener el formatting tradicional de contabilidad de las correcciones de débito y crédito lado a lado, o es mejor avanzar hacia un formatting que use numbers negativos de una manera significativa? Hay algunas circunstancias que favorecen cada una de estas elecciones de layout.

En su caso, dependerá de cómo pretenda utilizar los datos. Construiría prototypes con cada uno de los dos layouts y luego comenzaría a trabajar en el procesamiento CRUD fundamental para cada uno. Cualquiera que resulte más fácil en su entorno es el que elija.

Dijiste que la cantidad será unidades diferentes, entonces creo que debes mantener cada tabla por sí misma.

Personalmente, odio un layout de database que tenga "reglas diferentes" para llenar una tabla en function del tipo de entidad que se almacena en una fila. Simplemente se vuelve complicado, y es difícil mantener sus limitaciones vivas adecuadamente en una table como esa.

Simplemente cree una vista indexada que responderá a sus preguntas de saldo para mantener sus consultas "simples"

No hay una respuesta definitiva a esto y las respuestas se deberán en gran medida a las metodologías de layout de bases de datos adoptadas por el que responde.

Mi consejo sería probar ambas forms y ver cuál tiene el mejor compromiso entre consulta, performance y mantenimiento / usabilidad.

Siempre puede configurar una vista que devuelva las 3 tablas como una tabla para consultas y tiene un campo de type para el tipo de process al que se relaciona una fila.