Great question! The answer for what's best will vary depending on what makes the most sense for your circumstances, but my rule of thumb is to what you mention in the latter. The asset's output is supposed to represent the end state of the asset, with the body of it being what it takes to get there. So yeah, check if the table exists, copy, otherwise make it.
That being said, have you written your logic for how to relate or trigger the S3 bucket to the table? Depending on how the job is triggered, you might want to add some observability to your buckets with source asset.