Hola Pablo
Dependiendo de la cantidad de movimientos que tenga tu empresa por supuesto que podrías llegar a tener millones de filas en tu tabla, pero eso es algo normal y totalmente manejable. Puedo asegurarte que hay empresas mucho más grandes que la que estás informatizando que usan tablas SQL.
La idea es tener 2 tablas (y solamente 2 tablas)
- Una tabla cabecera, donde registras el identificador, el tipo de movimiento (compra, venta, devolución, etc.), la fecha del movimiento, el código del cliente o del proveedor, el tipo de documento, el número del documento, etc.
- Una tabla de detalles, donde registras el identificador, el código del producto, la cantidad, el precio unitario, el porcentaje del IVA, etc.
Como se trata de una relación padre-hijos, el identificador de la tabla cabecera debe ser único, jamás debe repetirse. Sin embargo ese identificador sí se repite en la tabla de detalles, en cada producto que corresponde a la cabecera.
Para mostrar en una grilla los productos, simplemente haces un SELECT ... WHERE MiCondicion, donde MiCondicion se refiere al identificador, por ejemplo:
SELECT MOV_CODIGO, MOV_CANTID, MOV_PRECIO 
  FROM MOVIMDET MD
    JOIN MOVIMCAB MC ON MOV_IDENTI = MC.MVC_IDENTI
WHERE MOV_IDENTI = 1245
En este ejemplo MOVIMCAB es la tabla cabecera y MOVIMDET es la tabla de detalles.
Por supuesto que en lugar de 1245 pondrías el identificador que deseas consultar.
Como consejo, no deberías permitir que una vez grabado un movimiento pueda ser modificado o borrado. Si permites esas operaciones, puedes llegar a tener problemas legales, por lo tanto, es mejor impedirlas.
Saludos.
Walter.