In essence Orion.Netflow.Flows contain all flows. FlowsBy* entities offer different view over that data. Their main purpose is to provide easy way to query directional fields (e.g. SourceIP and DestinationIP) regardless of their direction (as if there is IP field and you don't care whether it was received as source or destination). So yes, it's more for convenience and ease of use.
The purpose can be demonstrated with an example: let's say there is only one flow in database.
SELECT SourceIP, DestinationIP, SUM(Bytes) AS Bytes FROM Orion.Netflow.Flows GROUP BY SourceIP, DestinationIP
This would return only one row:
SourceIP DestinationIP Bytes 220.127.116.11 18.104.22.168 100
Now if you would use FlowsByIP entity as follows:
SELECT IP, SourceIP, DestinationIP, SUM(Bytes) AS Bytes FROM Orion.Netflow.FlowsByIP GROUP BY IP, SourceIP, DestinationIP
The result would be two rows:
IP SourceIP DestinationIP Bytes 22.214.171.124 126.96.36.199 188.8.131.52 100 184.108.40.206 220.127.116.11 18.104.22.168 100
Note that it only appears as if database contain two rows (in reality there is only one). IP column is virtual and contains source/destination field for first/second row - this virtual duplication happens for each flow. This is very useful if you need to filter or group by IP address disregarding its original direction. Same applies to other fields, for example Domain field is also virtual and would hold value from either SourceDomain or DestinationDomain.
If you don't need any of this logic, I suggest to use Flows entity. If you need to query directional fields disregarding their direction these entities are convenient way how to do that.
I hope this helps, let me know if you have any further questions.